解析文本文件的不同行的有效方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析文本文件的不同行的有效方法相关的知识,希望对你有一定的参考价值。

我有一个包含这样的数据的文本文件:

1 --- 1 --- 100

2 --- 1 --- 200

3 --- 1 --- 100

1 --- 2 --- 300

2 --- 2 --- 100

3 --- 2 --- 400

我想提取对应于第二列的不同值的第三列的数据,例如在第三列中添加与第二列中的数字1对应的三个数字,依此类推。我可以逐行循环文本,并找到每行中的第三列并添加它们。但这不是我想要的。我应该如何在Python中高效地完成它?

答案

使用itertools.groupby()

作为一个例子,我正在使用您确切的“数据结构”(stackoverflow问题中的一堆文本):

import itertools

data_structure = '''
1 --- 1 --- 100

2 --- 1 --- 200

3 --- 1 --- 100

1 --- 2 --- 300

2 --- 2 --- 100

3 --- 2 --- 400
'''.splitlines()

# create a key function able to extract the data you want to group:
def _key(line):
    return line.strip().split(' --- ')[1] # the 1 here means second column

#cleanup data:
clean_data = (line.strip() for line in data_structure if line.strip())

# then pass it to itertools.groupby:
for key, lines in itertools.groupby(clean_data, key=_key):
    print("Lines that contain number", key, 'in second column:')
    print(', '.join(lines))

结果:

Lines that contain number 1 in second column:
1 --- 1 --- 100, 2 --- 1 --- 200, 3 --- 1 --- 100
Lines that contain number 2 in second column:
1 --- 2 --- 300, 2 --- 2 --- 100, 3 --- 2 --- 400

编辑:既然你编辑了问题,并说你有一个文本文件,那么你可以用它代替data_structure它会工作:

data_structure = open('myfile.txt')

其余代码保持不变

以上是关于解析文本文件的不同行的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将生成器的输出写入文本文件?

如何在 R 中处理文本文件的所有元素

ListView 中的不同行布局

具有数组字段的 bigquery 表中的不同行

如何在数据框同一列的不同行之间执行集合之间的联合

需要一种有效的方法来避免使用 Laravel 5 重复代码片段