gzip 文件意外结束
gzip unexpected end of file
我可以根据 previous answers.
使用 gzip -t file.gz
和 zcat 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))
不,没有。您需要一直解压缩以查看 deflate 压缩数据是否正确终止,并且它后面是 32 位 CRC 和未压缩数据长度模 232.
如果你恰好知道解压数据的长度,或者知道一些长度限制,那么你可以检查gzip文件的最后四个字节,看看它是否匹配或满足限制。如果不一致,那么您就知道 gzip 文件没有完成。如果一致,那么只能得出大概可以的结论。 (有可能是流碰巧提前终止,最后四个字节意外地满足了约束。)
我可以根据 previous answers.
使用gzip -t file.gz
和 zcat 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))
不,没有。您需要一直解压缩以查看 deflate 压缩数据是否正确终止,并且它后面是 32 位 CRC 和未压缩数据长度模 232.
如果你恰好知道解压数据的长度,或者知道一些长度限制,那么你可以检查gzip文件的最后四个字节,看看它是否匹配或满足限制。如果不一致,那么您就知道 gzip 文件没有完成。如果一致,那么只能得出大概可以的结论。 (有可能是流碰巧提前终止,最后四个字节意外地满足了约束。)