【问题标题】:gzip unexpected end of filegzip 文件意外结束
【发布时间】:2025-12-13 12:35:02
【问题描述】:

我可以按照previous answers 使用gzip -t file.gzzcat file.gz > /dev/null 检查gzip 文件的完整性。

有时我的工作在一个大文件的压缩完成之前就死了。如果我从头到尾检查文件,我会收到关于文件意外结束的错误。但是是否可以只测试压缩文件没有意外结束,所以我不必通读整个文件?

根据以下 Mark Adler 的回答编辑 2018 年(Python 3.2+ 解决方案):

import os
import string
import gzip

with gzip.open('test.gz', 'wt') as f:
    f.write(string.ascii_lowercase)

with open('test.gz', 'rb') as f:
    f.seek(-4 , os.SEEK_END)
    length = int.from_bytes(f.read(), byteorder='little')
    assert length == 26
    print('Thanks Mark Adler!') 
    print('The English alphabet has {length} letters.'.format(length=length))

【问题讨论】:

    标签: python file io gzip


    【解决方案1】:

    不,没有。您需要一直解压缩以查看 deflate 压缩数据是否正确终止,并且后面是 32 位 CRC 和未压缩数据长度模 232

    如果你碰巧知道未压缩数据的长度,或者知道一些对长度的约束,那么你可以检查 gzip 文件的最后四个字节,看看它是否匹配或满足约束。如果它不同意,那么您就知道 gzip 文件没有完成。如果它确实同意,那么您只能得出结论可能没问题。 (有可能流碰巧提前终止,最后四个字节意外满足约束。)

    【讨论】:

    • 几年后才回到这里。如果我确实知道未压缩数据的长度,那么最后四个字节应该是多少?感谢您指出,可能存在误报。
    • 最后四个字节是未压缩的长度,模 2^32,以小端序排列。