将文本文件解析为字典列表

时间:2013-09-12 18:04:01

标签: python r data-structures dictionary

我有一个以这种格式保存数据的文本文件:

    21-Jun-2013 22:12:52:137, INFO, *********************************************************************
    21-Jun-2013 22:12:52:137, INFO, Data being shown
    21-Jun-2013 22:12:52:137, INFO, *********************************************************************
    21-Jun-2013 22:12:52:137, INFO, Meta-data
    21-Jun-2013 22:12:52:137, INFO, Meta-data
    21-Jun-2013 22:12:52:137, INFO, Exp                           1                         2    
    21-Jun-2013 22:12:52:168, INFO, -------------------------------------------------------------
    21-Jun-2013 22:12:52:184, INFO, 1           0.00000 *   1.00000       0.00000 *   1.00000    
    21-Jun-2013 22:12:31:919, INFO, 2           0.00000 *   1.00000       0.00000 *   2.00000
    21-Jun-2013 22:12:31:997, INFO, 3           0.00000 *   5.33380       0.00000 *   5.33380
    21-Jun-2013 22:12:32:059, INFO, 4           0.00000 *   0.00000       0.00000 *   0.00000
    21-Jun-2013 22:12:32:137, INFO, 5           0.00000 *   0.00000       0.00000 *   0.00000

此文件是程序的事件日志,用于调试程序。每行以时间戳开头。文件的前5行具有与文本文件相关的元数据,并且不感兴趣。要分析的数据从第6行开始。第6行是列的标题。第一列Exp存储数据的行ID。后续的column-headers只是column-id。这些列中的每一列中的数据是乘以的2个量(比如A * B)。实际数据的列数为千位,行-id为几百万。

现在,我想使用RPython处理此数据,以生成字典列表。对于给定的示例,我想要一个这样的字典列表:

    expressionList = [ row1 , row2 , row3, row4, row5 ]

列表中的每个元素都应该是字典。每个元素的扩展形式如下所示:

    row1   = { 'col1A': 0.00000, 'col1B': 1.00000, 'col2A': 0.00000, 'col2B': 1.00000 }
    row2   = { 'col1A': 0.00000, 'col1B': 1.00000, 'col2A': 0.00000, 'col2B': 2.00000 }
    row3   = { 'col1A': 0.00000, 'col1B': 5.33380, 'col2A': 0.00000, 'col2B': 5.33380 }
    row4   = { 'col1A': 0.00000, 'col1B': 0.00000, 'col2A': 0.00000, 'col2B': 0.00000 }
    row5   = { 'col1A': 0.00000, 'col1B': 0.00000, 'col2A': 0.00000, 'col2B': 0.00000 }

我对这两种编程语言都很陌生 - 任何帮助/指导都非常感谢!

2 个答案:

答案 0 :(得分:5)

正如评论read.table中所述,应该对您的数据有效。

这是一个例子。您的文本文件已在我的主目录中保存为“mytest.txt”。用实际路径替换您的文件。我们已指定“skip = 7”删除前几行:

mydf <- read.table("~/mytest.txt", skip=7)
mydf
#            V1            V2    V3 V4 V5 V6     V7 V8 V9    V10
# 1 21-Jun-2013 22:12:52:184, INFO,  1  0  * 1.0000  0  * 1.0000
# 2 21-Jun-2013 22:12:31:919, INFO,  2  0  * 1.0000  0  * 2.0000
# 3 21-Jun-2013 22:12:31:997, INFO,  3  0  * 5.3338  0  * 5.3338
# 4 21-Jun-2013 22:12:32:059, INFO,  4  0  * 0.0000  0  * 0.0000
# 5 21-Jun-2013 22:12:32:137, INFO,  5  0  * 0.0000  0  * 0.0000

您可以使用TRUEFALSE的向量对R中的列进行子集化。在这里,模式似乎是我们想要删除的一组四列,然后是“保持,丢弃,保持”模式。

## Create the vector of what we want to keep (TRUE) and drop (FALSE)
keepdrop <- c(FALSE, FALSE, FALSE, FALSE, rep(c(TRUE, FALSE, TRUE),
              length.out=length(mydf)-4))
## Subset to drop the unwanted columns
mydf <- mydf[keepdrop]

## Let's make some nicer names
cols <- length(mydf) %/% 2
names(mydf) <- paste("col", sequence(cols), 
                     rep(c("A", "B"), each = cols), 
                     sep = "_")

## The final output
mydf
#   col_1_A col_2_A col_1_B col_2_B
# 1       0  1.0000       0  1.0000
# 2       0  1.0000       0  2.0000
# 3       0  5.3338       0  5.3338
# 4       0  0.0000       0  0.0000
# 5       0  0.0000       0  0.0000

从这里,访问信息非常简单:

### Third row
mydf[3, ]
#   col_1_A col_2_A col_1_B col_2_B
# 3       0  5.3338       0  5.3338

### Second column, as a data.frame, by position
mydf[, 2, drop = FALSE]
#   col_2_A
# 1  1.0000
# 2  1.0000
# 3  5.3338
# 4  0.0000
# 5  0.0000

### Fourth column, as a vector, by name
mydf[, "col_2_B"]
# [1] 1.0000 2.0000 5.3338 0.0000 0.0000

除此之外,您可能希望从“data.table”包中查看fread函数,这有助于更快地读取大数据。

答案 1 :(得分:1)

如果您对时间戳不太在意,我建议使用numpy的loadtxt函数。

import numpy as np

data = np.loadtxt('test.txt', skiprows=7, usecols=(4,6,7,9),
            dtype={'names':   ('col1', 'col2', 'col3', 'col4'),
                   'formats': ('f4',   'f4',   'f4',   'f4')})

这为您提供了一系列访问数据的方法:

print data[0]
print data['col2']
print data['col2'][2:]
print data['col2'][2]
print data[2]['col2']
print data[2][1]

(0.0,1.0,0.0,1.0)

[1. 1. 5.33379984 0. 0.]

[5.33379984 0。0.]

5.3338

5.3338

5.3338

-

如果要保留时间戳,可以随时将它们存储为字符串并稍后对其进行解析。

哦,注意缺失值!解析器可能不喜欢它们(除非它们具有与值本身相同的数据类型)。 Numpy的genfromtxt函数有处理它们的方法,虽然我没有做太多。它基本上是类固醇的加载文件。