Python逐块解压gzip

8 浏览
0 Comments

Python逐块解压gzip

我在一个内存和磁盘受限的环境中,需要解压以字符串形式分块发送给我的gzip文件(通过xmlrpc二进制传输)。然而,使用zlib.decompress()或zlib.decompressobj()/decompress()都无法处理gzip头部。我已尝试偏移超过gzip头部(在这里有文档),但仍然无法避免出错。gzip库本身似乎只支持从文件解压缩。

以下代码片段简要说明了我想要做的事情(实际情况下,缓冲区将从xmlrpc中填充,而不是从本地文件读取):

#! /usr/bin/env python
import zlib
CHUNKSIZE=1000
d = zlib.decompressobj()
f=open('23046-8.txt.gz','rb')
buffer=f.read(CHUNKSIZE)
while buffer:
  outstr = d.decompress(buffer)
  print(outstr)
  buffer=f.read(CHUNKSIZE)
outstr = d.flush()
print(outstr)
f.close()

不幸的是,正如我所说的,这导致出错:

Traceback (most recent call last):
  File "./test.py", line 13, in 
    outstr = d.decompress(buffer)
zlib.error: Error -3 while decompressing: incorrect header check 

理论上,我可以将来自xmlrpc的数据输入到StringIO中,然后将其用作gzip.GzipFile()的fileobj,但是在实际情况下,我没有足够的内存来保存整个文件内容以及解压后的数据。我确实需要逐块处理它。

备选方案是将xmlrpc数据的压缩方式从gzip更改为纯zlib,但由于会影响其他子系统,我宁愿避免这种情况。

有什么建议吗?

0