【问题标题】:Python 2.7 filecmp.cmp returns false even though the gzipped files are identical即使 gzip 压缩的文件相同,Python 2.7 filecmp.cmp 也会返回 false
【发布时间】:2018-04-26 00:46:39
【问题描述】:

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

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

它返回 false,因为 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行)

谢谢!

【问题讨论】:

    标签: python gzip fastq cmp file-comparison


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢@Mark。我实际上对 gzipping 过程没有任何控制权。您对如何解压缩和比较文件有什么建议吗? (然后是 gzip.open 每一个并逐行循环..)我可以使用 filecmp 以某种方式做到这一点吗?
    • 如果您只是想确定它们是相同还是不同,我不会使用 diff 或逐行阅读来做到这一点。 diff 可能会消耗大量内存来尝试维护历史记录以查找匹配数据。如果长时间没有换行,逐行会消耗内存,这很容易出现在二进制数据中。您应该读取并解压缩这两个 gzip 文件,并逐字节比较二进制结果。一旦看到任何差异,您就停止并中止两次减压。如果你坚持到最后,那么两者是相同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2017-05-26
    相关资源
    最近更新 更多