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

在Python中逐列比较两个大型文本文件,python,compare,large-files,Python,Compare,Large Files,我有两个大的选项卡分隔文本文件,尺寸为:36000行x3000列。两个文件中的列的结构相同,但它们可能无法排序 我只需要比较这两个文件(APPX2970列)之间的数字列,并导出任何两个相应列之间的值存在差异的行 问题:内存问题 我尝试过的事情: 1) 数据转换:将数据从宽变长,逐块读取数据。 问题:数据膨胀到几百万行以上,python抛出了一个内存错误 2) Difflib:Difflib以及生成器和无转置确实为我提供了一个高效的输出,但它逐行比较了两个文件。它不区分选项卡分隔文件中的列。(我需

我有两个大的选项卡分隔文本文件,尺寸为:36000行x3000列。两个文件中的列的结构相同,但它们可能无法排序

我只需要比较这两个文件(APPX2970列)之间的数字列,并导出任何两个相应列之间的值存在差异的行

问题:内存问题

我尝试过的事情:

1) 数据转换:将数据从宽变长,逐块读取数据。 问题:数据膨胀到几百万行以上,python抛出了一个内存错误

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

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

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


如果您对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
那样一次压缩所有内容。 在Python3中,使用
zip
。它在那里做的事情是正确的。 它将一行一行地进行,并产生一对

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

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

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

您是否已经编写了一些代码?两个文件的行数是否完全相同,即您总是将一个文件中的N行与另一个文件中的N行进行比较?@PatrickHaugh-我确实为我尝试的每一件事情编写了一些代码。这都是基本的转置,并使用Difflib包中的直接函数。这就是我没有发布任何代码的原因。@JohnGordon-不,行数可以不同。因此,我想到了连接方法,在这种方法中,我可以为每个块创建一个小数据集,并输出不同的行。但它会很慢。这是一个很好的策略。但是,如果文件没有排序,或者它们没有完全相同的数据,则会给出错误的输出。是否可以修改此选项,以搜索文件1中的记录,使其出现在文件2中的任何位置,然后进行比较?@codemob这是一项困难得多的任务,最佳解决方案取决于详细信息。一般来说,对于随机排序的行,要么将整个文件都放在内存中(即读取所有文件),要么从磁盘进行大量读取。在某些情况下,分批读取(例如,一次读取1000行)可能是有意义的。在其他情况下,如果您只需要跳过某些行,则可以使用类似的方法,但偶尔可以使用例如
next(f1)
,跳过一行。如果未排序,请考虑使用sql数据库。这将需要更多的时间,但您可以通过按键进行搜索