Python, распаковывающий gzip блок блоком

У меня есть память - и ограниченная диском среда, где я должен распаковать содержание 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, но так как это влияет на другие подсистемы, я предпочел бы избегать его, если это возможно.

Какие-либо идеи?

33
задан user291294 11 March 2010 в 09:35
поделиться

1 ответ

gzip и zlib используют несколько разные заголовки.

См. Как распаковать поток gzip с помощью zlib?

Попробуйте d = zlib.decompressobj (16 + zlib.MAX_WBITS) .

И вы можете попробовать изменить размер блока до степени 2 (скажем, CHUNKSIZE = 1024 ) из возможных соображений производительности.

45
ответ дан 27 November 2019 в 18:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: