У меня есть память - и ограниченная диском среда, где я должен распаковать содержание gzip файла, отправленного мне в основанных на операция со строками блоках (по xmlrpc двоичной передаче). Однако с помощью zlib.decompress () или zlib.decompressobj () / распаковка () оба блюют по 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 и затем использовать это в качестве fileobj для gzip. GzipFile (), однако, в реальной жизни, я не имею память в наличии для содержания всего содержания файла в памяти, а также распакованных данных. Я действительно должен обработать его блок блоком.
Нейтрализация должна была бы изменить сжатие моих xmlrpc-полученных данных от gzip до плоскости zlib, но так как это влияет на другие подсистемы, я предпочел бы избегать его, если это возможно.
Какие-либо идеи?
gzip и zlib используют несколько разные заголовки.
См. Как распаковать поток gzip с помощью zlib?
Попробуйте d = zlib.decompressobj (16 + zlib.MAX_WBITS)
.
И вы можете попробовать изменить размер блока до степени 2 (скажем, CHUNKSIZE = 1024
) из возможных соображений производительности.