我有两个大型制表符分隔的文本文件,尺寸为:36000 行 x 3000 列。两个文件中的列结构相同,但可能未排序。
我需要仅比较这两个文件之间的数字列(大约 2970 列),并导出任意两个相应列之间的值存在差异的那些行。
问题:内存问题
我尝试过的事情:
1)转置数据:将数据由宽变长,并逐 block 读取数据。 问题:数据膨胀到超过几百万行,Python 抛出内存错误
2) Difflib:Difflib 与生成器一起且无需转置,确实为我提供了一个高效的输出,但它逐行比较两个文件。它不会区分制表符分隔文件中的列。(我需要将它们区分为列,因为我将在差异行之间执行一些列操作。
3)分块和连接:这是我尝试的第三种方法,其中我将一个文件分成多个 block ,然后将其与另一个文件在公共(public)键上重复合并,并找到这些 block 中的差异。这将是一种糟糕的方法,并且需要花费很多时间,但我无法想到其他任何事情。
另外: 这类问题过去已经得到解答,但它们只处理一个巨大的文件并处理相同的文件。
任何关于Python更好方法的建议将不胜感激。谢谢。
最佳答案
首先,如果文件那么大,应该逐行读取。
逐行读取一个文件很简单:
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
现在选择相关列并进行比较。然后丢弃不相关的行并将相关的行写入输出。
关于python - 在Python中逐列比较两个大文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028560/