使用Python读取未正确关闭的gz文件

使用Python读取未正确关闭的gz文件,python,gzip,Python,Gzip,当我尝试使用gzip库用python读取gz文件时,它会生成一个错误,就像您尝试在其上运行gunzip一样。但是,使用perl可以做到这一点,因为我不相信它使用的库会对正在读取的文件进行额外的干净EOF检查 我的问题是,是否有任何选项或替代库可以在python中读取这样的文件,或者我只需要在perl中执行此操作?标准python库可以用于此操作,尽管比完整文件更笨拙 >>> import zlib >>> compressed=zlib.compress(st

当我尝试使用gzip库用python读取gz文件时,它会生成一个错误,就像您尝试在其上运行gunzip一样。但是,使用perl可以做到这一点,因为我不相信它使用的库会对正在读取的文件进行额外的干净EOF检查


我的问题是,是否有任何选项或替代库可以在python中读取这样的文件,或者我只需要在perl中执行此操作?

标准python库可以用于此操作,尽管比完整文件更笨拙

>>> import zlib
>>> compressed=zlib.compress(str(range(200)))
>>> len(compressed)
375
>>> trunc=compressed[:50]
>>> zlib.decompress(trunc)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zlib.error: Error -5 while decompressing data: incomplete or truncated stream
>>> d=zlib.decompressobj()
>>> d.decompress(trunc)
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9'
>>> d.flush()
''
(我没有看到flush()实际返回任何内容,但这可能是因为这是一个非常简单的数据示例。)


编辑:我错过了一点。Gzip文件有一个通常由Gzip模块处理的头,因此对zlib的原始访问不会直接读取Gzip文件。使用GzipFile和读取较小的数据块可能更容易

标准Python库可用于此目的,尽管比完整文件更笨拙

>>> import zlib
>>> compressed=zlib.compress(str(range(200)))
>>> len(compressed)
375
>>> trunc=compressed[:50]
>>> zlib.decompress(trunc)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zlib.error: Error -5 while decompressing data: incomplete or truncated stream
>>> d=zlib.decompressobj()
>>> d.decompress(trunc)
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9'
>>> d.flush()
''
(我没有看到flush()实际返回任何内容,但这可能是因为这是一个非常简单的数据示例。)


编辑:我错过了一点。Gzip文件有一个通常由Gzip模块处理的头,因此对zlib的原始访问不会直接读取Gzip文件。使用GzipFile和读取较小的数据块可能更容易

要解压缩内存中不完整的gzip字节,可以使用,但会丢失我认为必要的
wbits
arg:

incomplete_decompressed_content = zlib.decompressobj(wbits=zlib.MAX_WBITS | 16).decompress(incomplete_gzipped_content)
请注意,
zlib.MAX|WBITS | 16
15 | 16
,即31。有关
wbits
的一些背景信息,请参阅



信用:注意不同编码所需的
wbits
不同值的下界。

要解压缩内存中不完整的gzip字节,是有用的,但它忽略了我认为必要的
wbits
参数:

incomplete_decompressed_content = zlib.decompressobj(wbits=zlib.MAX_WBITS | 16).decompress(incomplete_gzipped_content)
请注意,
zlib.MAX|WBITS | 16
15 | 16
,即31。有关
wbits
的一些背景信息,请参阅



信贷:注意到不同编码所需的
wbits
不同值的下限。

yann-你误解了,我不是想弄清楚如何用zlib压缩文件,而是想弄清楚如何读取一个没有正确刷新/关闭的文件-你误解了,我不是想弄清楚如何用zlib压缩文件,而是想弄清楚如何读取一个没有正确刷新/关闭的文件