从文件访问类似的行并应用函数

时间:2016-08-03 23:35:41

标签: python

我正在尝试从文件中访问类似的行,然后对其值应用总和。

这是我的输入文件格式:

K1 20
K2 23
K3 24
K3 14
K3 10
K2 5

所以,我的目标是创建一个输出文件,为每条记录创建一个值的总和:

K1 20
K2 28
K3 48
  • 这是一个大文本文件> 20GB。所以我无法立刻将整个内容存储到内存中。
  • 我成功地将文件读入块中并为每个块执行每个记录的总和,现在我想合并这些输出块。

例如第一个块

K1 20
K2 23
K3 24

第二块

K3 24
K2 5

现在我迷失了如何将它们全部合并并继续使用新值更新记录。

合并后的新值将是

K1 20

K2 28

K3 48

2 个答案:

答案 0 :(得分:1)

以下内容应完成所需的功能。

from collections import Counter

output = Counter()

with open("input.txt") as file:
    for line in file.read().split('\n'):
        if line:
            key, value = line.split()

            output[key] += int(value)

with open("output.txt", 'w+') as file:
    for key, value in output.items():
        file.write("{key} {value}\n".format(key=key, value=value))

答案 1 :(得分:0)

  

这是一个大文本文件> 20GB。所以我不能立刻把整个东西存入记忆中。

  1. 文件有多大并不重要。重要的是有多少独特记录,因为您只保留唯一记录。
  2. Python Counter仍然会将其保留在内存中。如果您在受限制的环境中运行,这对您没有任何好处。
  3. 我的建议:

    • 按字母顺序对文件进行排序。我只是通过unix sort发送它。 (我假设你的FS有空间)
    • 迭代线条。提取当前记录的第一部分。迭代记录的第一部分是相同的 - 同时总结第二部分。
    • 当记录类型改变时 - 在文件中写一行 - 用你记忆中保存的金额为止。
    • 重复。