Python 2.7 filecmp.cmp returns false 即使 gzip 文件相同

Python 2.7 filecmp.cmp returns false even though the gzipped files are identical

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

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

它returns假的,因为f1和f2是不同的。但是当我使用 diff/comm 比较文件时,我得到 0 输出(我解压缩然后比较)。我尝试了 shallow=True 和 False。 我正在尝试打印出差异,但 运行 内存不足。

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

是因为文件被压缩了吗?关于如何在不解压缩它们的情况下比较它们的任何想法? (每个文件200M行)

谢谢!

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

如果您控制 gzip 进程,使用相同的代码和相同的压缩级别以及其他选项,由于 header 内容。 header 可能有不同的时间戳、不同的文件名或其他变体。在这种情况下,您可以跳过每个 header(使用 RFC 1952 作为 header 何时结束的指南),然后比较每个的其余部分。鉴于规定的条件,这两个文件的其余部分将是相同的。

如果您可以控制压缩并且您知道每个 gzip 文件都包含一个 gzip 成员,您可以做的另一件事是检查每个文件的最后八个字节。如果它们不相同,则压缩数据不同。如果相同,那么内容可能相同,所以需要解压比较,或者使用上面的方法。这可以节省大量时间,因为几乎不必比较具有不同未压缩内容的 gzip 文件。最后八个字节是未压缩数据的 four-byte CRC,以及未压缩数据的长度模 232.