online decompress python gzip zlib

decompress - zlib python



Python descomprime gzip trozo por trozo (2)

Tengo una respuesta más detallada aquí: https://stackoverflow.com/a/22310760/1733117

d = zlib.decompressobj(zlib.MAX_WBITS|32)

Según la documentación, esto detecta automáticamente el encabezado (zlib o gzip) .

Tengo un entorno de memoria y disco limitado donde necesito descomprimir el contenido de un archivo gzip que se me envió en fragmentos basados ​​en cadenas (sobre transferencia binaria xmlrpc). Sin embargo, utilizando zlib.decompress () o zlib.decompressobj () / decompress () ambos barf sobre el encabezado gzip. He intentado compensar más allá del encabezado gzip (documentado here ), pero aún no he logrado evitar el barf. La biblioteca gzip en sí misma solo parece ser compatible con la descompresión de archivos.

El siguiente fragmento de código proporciona una ilustración simplificada de lo que me gustaría hacer (excepto en la vida real, el búfer se llenará desde xmlrpc, en lugar de leer desde un archivo local):

#! /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()

Lamentablemente, como dije, este barfs con:

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

Teóricamente, podría ingresar mis datos de origen xmlrpc en un StringIO y luego usarlos como un archivo de archivo para gzip.GzipFile (), sin embargo, en la vida real, no tengo memoria disponible para guardar todo el contenido del archivo en la memoria como la información descomprimida. Realmente necesito procesarlo parte por parte.

La alternativa sería cambiar la compresión de mis datos de origen xmlrpc de gzip a zlib simple, pero como eso afecta a otros subsistemas, preferiría evitarlo si es posible.

¿Algunas ideas?


gzip y zlib usan encabezados ligeramente diferentes.

Consulte ¿Cómo puedo descomprimir una secuencia de gzip con zlib?

Pruebe d = zlib.decompressobj(16+zlib.MAX_WBITS) .

Y puede intentar cambiar el tamaño de su fragmento a una potencia de 2 (por ejemplo, CHUNKSIZE=1024 ) por posibles motivos de rendimiento.