У меня есть среда с ограничениями на память и диск, где мне нужно распаковать содержимое файла gzip, отправленного мне в строках на основе строк (через двоичную передачу xmlrpc). Однако, используя zlib.decompress() или zlib.decompressobj()/dempress(), оба 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, а затем использовать это как файл для gzip.GzipFile(), однако в реальной жизни у меня нет памяти для хранения всего содержимого файла в памяти, а также распакованных данных. Мне действительно нужно обработать этот фрагмент.
Отказ будет заключаться в том, чтобы изменить сжатие моих данных xmlrc-sourced от gzip до простого zlib, но поскольку это влияет на другие подсистемы, я бы предпочел избежать его, если это возможно.
Любые идеи?