【问题标题】:Merging 3 files into 1 large file, while appending to specific lines in Python将 3 个文件合并为 1 个大文件,同时附加到 Python 中的特定行
【发布时间】:2021-05-28 20:52:34
【问题描述】:

我有 3 个大文件,每个文件都包含相似的内容,但不一样。第一部分是令牌,第二部分是一个字典,其中包含一个整数作为文档 ID,以及它在该特定文档中出现的次数。我的问题是,我无法将所有内容都存储到内存中,并且由于数据非常大,我需要多次转储到文件中。例如:

文件1:

token1;{"1": 5, "2": 5, "4": 5}
token2;{"2": 3, "3": 4}
token3;{"1": 4, "5": 1, "6": 6}

文件2:

token4;{"7": 2, "9": 1, "12": 2}
token5;{"8": 3, "11": 1, "12": 2}
token2;{"9": 2, "12": 2}

文件3:

token1;{"13": 1, "14": 2}
token6;{"14": 1, "16": 2, "17": 1}
token7;{"14": 1, "17": 2, "18": 1, "19", 3}

我希望在最终文件中包含的最终内容:

token1;{"1": 5, "2": 5, "4": 5, "13": 1, "14": 2}
token2;{"2": 3, "3": 4, "9": 2, "12": 2}
token3;{"1": 4, "5": 1, "6": 6}
token4;{"7": 2, "9": 1, "12": 2}
token5;{"8": 3, "11": 1, "12": 2}
token6;{"14": 1, "16": 2, "17": 1}
token7;{"14": 1, "17": 2, "18": 1, "19", 3}

我希望更新的重复令牌,以及将所有新令牌添加到一个文件中。我无法将所有内容都加载到内存中,但是即使需要很长时间,我也可以逐行浏览每一行。 (这次效率不是最高优先级)。非常感谢任何正确方向的指南!谢谢 :) 附言我正在用 Python 写这个

【问题讨论】:

  • 想必你应该使用数据库。
  • @mkrieger1 不幸的是,由于这是学校作业的一部分,我们被告知不要使用数据库。为什么?我也不确定,我很想知道,但我不能使用数据库
  • “非常大”有多大?
  • 请从intro tour 重复on topic 和how to ask。 “告诉我如何解决这个编码问题”不是堆栈溢出问题。我们希望您做出诚实的尝试,然后然后就您的算法或技术提出一个具体的问题。 Stack Overflow 并不打算取代现有的文档和教程。这是排序序列的直接合并。

标签: python file merge


【解决方案1】:

我需要休息一下,所以...

from io import StringIO
import json

data = [
    '''\
token1;{"1": 5, "2": 5, "4": 5}
token2;{"2": 3, "3": 4}
token3;{"1": 4, "5": 1, "6": 6}
''',
    '''\
token4;{"7": 2, "9": 1, "12": 2}
token5;{"8": 3, "11": 1, "12": 2}
token2;{"9": 2, "12": 2}
''',
    '''\
token1;{"13": 1, "14": 2}
token6;{"14": 1, "16": 2, "17": 1}
token7;{"14": 1, "17": 2, "18": 1, "19": 3}
''',
]

out = {}
for text in data:
    f = StringIO(text)
    for line in f:
        key, s = line.split(';', 1)
        d = json.loads(s)
        out.setdefault(key, {}).update(d)

for key in sorted(out, key=lambda t: int(t[5:])):
    s = json.dumps(out[key])
    print(f"{key};{s}")

用您的文件对象替换 data 和 StringIO() 实例。

【讨论】:

  • 嗯,这很糟糕。我没有注意到 OP 的评论“无法将所有内容存储到内存中”。太忙了,无法编辑我上面的答案,但也许您可以对令牌上的行进行排序,然后分批处理数据,即token1 到 token100 将是一批,然后是token101 到 token200。
  • 这让我找到了我正在寻找的答案,所以谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2016-04-28
  • 2023-03-06
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多