在Python

时间:2016-10-13 18:39:26

标签: python compare large-files

我有两个大的制表符分隔文本文件,其尺寸为:36000行x 3000列。两个文件中列的结构相同,但可能无法对它们进行排序。

我需要仅比较这两个文件(apprx 2970列)之间的数字列,并导出那些任意两列之间的值存在差异的行。

问题:内存问题

我尝试的事情:

1)转置数据:使数据从大到长,并按块读取数据块。 问题:数据膨胀到超过几百万行,python引发了内存错误

2)Difflib:Difflib和发生器并没有转置确实为我提供了有效的输出,但它逐行比较了两个文件。它没有区分选项卡分隔文件中的列。(我需要将它们区分为列,因为我将在差异行之间执行一些列操作。

3)Chunk and join:这是我尝试的第三种方法,其中我将一个文件分成块,并将其与另一个文件在公共密钥上重复合并,并找出这些块中的差异。这将是一个糟糕的方法,它将花费很多时间,但我无法想到任何其他事情。

此外: 过去已经回答过这些类型的问题,但它们只涉及一个巨大的文件并处理相同的问题。

非常感谢任何有关 Python 更好方法的建议。谢谢。

1 个答案:

答案 0 :(得分:2)

首先,如果文件很大,则应逐行阅读。

逐行读取一个文件很简单:

with open(...) as f:
    for row in f:
        ...

要逐行迭代两个文件,请将它们压缩:

with open(...) as f1, open(...) as f2:
    for row1, row2 in itertools.izip(f1, f2):
        # compare rows, decide what to do with them

我使用了izip,因为它不会一次压缩所有内容,就像Python 2中的zip一样。 在Python 3中,使用zip。它在那里做对了。 它将逐行进行并产生对。

下一个问题是按列进行比较。将列分开:

columns = row.split('\t')  # they are separated by tabs, therefore \t

现在选择相关列并进行比较。然后丢弃不相关的行并将相关的行写入输出。