Skip to main content
 首页 » 编程设计

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

2025年05月04日17pengyingh

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

    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。随后的列标题只是列 ID。这些列中的每一列中的数据都是相乘的 2 个数量(比如 A*B)。实际数据有千级的column-ids和几百万级的row-ids。

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

    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 } 

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

请您参考如下方法:

如评论中所述,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 

您可以使用 TRUE 和 FALSE 向量对 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 函数,这将有助于更快地读取大数据。