gpt4 book ai didi

python - 使用 python 解压缩 .gz 文件的一部分

转载 作者:太空狗 更新时间:2023-10-29 20:32:39 25 4
gpt4 key购买 nike

所以问题来了。我有大约 60KB 大小的 sample.gz 文件。我想解压这个文件的前 2000 个字节。我遇到了 CRC 校验失败错误,我猜是因为 gzip CRC 字段出现在文件末尾,它需要整个 gzip 文件才能解压缩。有办法解决这个问题吗?我不关心 CRC 检查。即使我因为错误的 CRC 而无法解压,也没关系。有没有办法解决这个问题并解压缩部分 .gz 文件?

我目前的代码是

import gzip
import time
import StringIO

file = open('sample.gz', 'rb')
mybuf = MyBuffer(file)
mybuf = StringIO.StringIO(file.read(2000))
f = gzip.GzipFile(fileobj=mybuf)
data = f.read()
print data

遇到的错误是

File "gunzip.py", line 27, in ?
data = f.read()
File "/usr/local/lib/python2.4/gzip.py", line 218, in read
self._read(readsize)
File "/usr/local/lib/python2.4/gzip.py", line 273, in _read
self._read_eof()
File "/usr/local/lib/python2.4/gzip.py", line 309, in _read_eof
raise IOError, "CRC check failed"
IOError: CRC check failed

还有什么方法可以使用 zlib 模块来执行此操作并忽略 gzip header 吗?

最佳答案

gzip 模块的问题不是它不能解压缩部分文件,错误仅在最后尝试验证解压缩内容的校验和时发生。 (原始校验和存储在压缩文件的末尾,因此验证永远不会对部分文件起作用。)

关键是让 gzip 跳过验证。 answer by caesar0301通过修改 gzip 源代码来做到这一点,但没有必要走那么远,简单的猴子补丁就可以了。我写了这个上下文管理器来临时替换 gzip.GzipFile._read_eof,同时解压部分文件:

import contextlib

@contextlib.contextmanager
def patch_gzip_for_partial():
"""
Context manager that replaces gzip.GzipFile._read_eof with a no-op.

This is useful when decompressing partial files, something that won't
work if GzipFile does it's checksum comparison.

"""
_read_eof = gzip.GzipFile._read_eof
gzip.GzipFile._read_eof = lambda *args, **kwargs: None
yield
gzip.GzipFile._read_eof = _read_eof

用法示例:

from cStringIO import StringIO

with patch_gzip_for_partial():
decompressed = gzip.GzipFile(StringIO(compressed)).read()

关于python - 使用 python 解压缩 .gz 文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1732709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com