python - 在Python中逐列比较两个大文本文件

标签 python compare large-files

我有两个大型制表符分隔的文本文件,尺寸为: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/

相关文章:

python - 为什么 .format(function()) 不起作用,但 % 打印值?

php - 在 PHP 中使用分块上传 1GB 文件

c++ - 奇怪的 boolean 返回行为

c - 如何使用 C 捕获 FILE IO 中的错误?

r - 有没有办法在 R 中读写内存文件?

python - cython:将 2D numpy 数组传递给 cdef 函数

python - 在给定范围内找到函数的根

python - 从单个模板中的两个 Django 模型检索记录

java - 抽象算法 : String/Byte Comparison/Diff

c# - 比较两个大型 CSV 文件以删除相同的行/记录