我在一个内存和磁盘受限的环境中,需要解压以字符串形式分块发送给我的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 <module>
outstr = d.decompress(buffer)
zlib.error: Error -3 while decompressing: incorrect header check
理论上,我可以将XML-RPC获取的数据输入StringIO,然后将其用作gzip.GzipFile()的fileobj,但在实际生活中,我没有足够的内存来容纳整个文件内容以及解压缩后的数据。我确实需要逐块处理它。如果必须更改xmlrpc源数据的压缩方式,则可以退回到将其从gzip更改为普通的zlib,但由于这会影响其他子系统,因此如果可能的话,我希望避免这样做。
有什么想法吗?