У меня ограниченная память и диск среда, в которой мне нужно распаковать содержимое gzip-файла, отправленного мне в виде кусочков на основе строк (через двоичную передачу xmlrpc). Однако, используя zlib.decompress () или zlib.decompressobj () / depress (), оба barf над заголовком gzip. Я пытался сместить за пределы заголовка gzip (задокументировано здесь ), но все еще не удалось избежать barf. Сама библиотека 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()
К сожалению, как я уже сказал, это barfs с:
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
Теоретически, я мог бы передать свои данные из xmlrpc в StringIO, а затем использовать их как fileobj для gzip.GzipFile (), однако в реальной жизни у меня нет доступной памяти для хранения всего содержимого файла в память, а также распакованные данные. Мне действительно нужно обрабатывать его по частям.
В качестве альтернативы можно было бы изменить сжатие моих исходных данных xmlrpc с gzip на обычный zlib, но, поскольку это влияет на другие подсистемы, я бы предпочел избежать этого, если это возможно.
Есть идеи?