即使gzip压缩文件相同,Python 2.7 filecmp.cmp也会返回false

时间:2018-04-26 00:46:39

标签: python gzip fastq cmp file-comparison

我正在比较一堆fastq.gz文件。每个文件都是~4G:

if filecmp.cmp(f1,f2,shallow=False)

返回false,如f1和f2不同。但是当我使用diff / comm比较文件时,我得到0输出(我解压缩然后比较)。我试了两个浅=真和假。 我正在尝试打印出差异,但内存不足。

diff=difflib.ndiff((gzip.open(f1)).readlines(),(gzip.open(f2)).readlines())
print [i for i in diff if i.startswith('+')]

是因为文件是gzip压缩的吗?关于如何比较它们而不解压缩它们的任何想法? (每个文件是200M行)

谢谢!

1 个答案:

答案 0 :(得分:2)

通常,您需要比较未压缩的输出。这是确定两个gzip文件是否具有相同未压缩内容的唯一方法。它们可以使用不同的压缩级别或不同的gzip软件进行压缩,从而得到不同的压缩结果。唯一的保证是当你压缩然后解压缩时,你得到原始输入。无法保证当您解压缩然后压缩时,您将获得原始输入。

如果你控制gzip进程,使用相同的代码和相同的压缩级别和其他选项,由于标题内容,可以获得不同的输出。标题可以具有不同的时间戳,不同的文件名或其他变体。在这种情况下,您可以跳过每个标题(使用RFC 1952作为标题结束时的指南),并比较每个标题的余数。鉴于所述条件,两个文件的剩余部分将是相同的。

你可以做的另一件事,如果你控制压缩并且你知道每个gzip文件由一个gzip成员组成,你可以检查每个文件的最后八个字节。如果它们不相同,则压缩数据不同。如果它们相同,则内容可能相同,因此您需要进行解压缩和比较,或使用上述方法。这可以节省大量时间,几乎不必比较具有不同未压缩内容的gzip文件。最后8个字节是未压缩数据的四字节CRC,未压缩数据的长度为2 32