将压缩文件与 gzip 和 filecmp 模块进行比较 returns False on python 3.10

Compare compressed files with gzip and filecmp modules returns False on python 3.10

当我 运行 在 python3 上执行以下代码时,filecmp() 的结果为 False。 为什么会这样? 我以为压缩两次同一个文件会输出两个内容完全相同的文件。

import filecmp
import shutil
import gzip

with open('base_file.fastq', 'rb') as f_in:
  with gzip.open('compressed_one.fastq.gz', "wb") as f_out:
    shutil.copyfileobj(f_in, f_out)


with open('base_file.fastq', 'rb') as f_in:
  with gzip.open('compressed_two.fastq.gz', "wb") as f_out:
    shutil.copyfileobj(f_in, f_out)

filecmp.cmp('compressed_one.fastq.gz',  'compressed_two.fastq.gz', shallow=False)

gziped 文件是结构化文件,而不仅仅是一些字节的文件。它有 header 信息、压缩内容和页脚。创建 gzip 文件时,header 和页脚也会添加到压缩文件内容中。

在您的情况下,您使用相同的压缩代码和级别对同一个文件进行两次压缩,因此压缩后的内容将是相同的。但是 gzip header 会有所不同。根据 documentation,python 允许您配置 filenamemodification_time 的 header 值。如果未指定这些,则使用默认值,如当前时间。

在您的情况下,每次压缩同一个文件时,一切都保持不变,但 header 不同。所以文件内容有变化filecmpreturnsFalse。如果你想让输出文件相同,那么你可以使用:

gzip.GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None)

压缩内容,具有相同的header信息。