online library decompress python gzip zlib

python - library - zlib.error: Error-3 al descomprimir: comprobación de encabezado incorrecta



zlib python (6)

Acabo de resolver el problema de la "comprobación incorrecta del encabezado" al descomprimir los datos gzipped.

Debe configurar -WindowBits => WANT_GZIP en su llamada a inflateInit2 (use la versión 2)

Sí, esto puede ser muy frustrante. Una lectura generalmente superficial de la documentación presenta Zlib como una compresión de compresión de Gzip de API, pero de forma predeterminada (sin usar los métodos gz *) no crea ni descomprime el formato de Gzip. Tienes que enviar esta bandera no muy prominentemente documentada.

Tengo un archivo gzip y estoy intentando leerlo a través de Python como se muestra a continuación:

import zlib do = zlib.decompressobj(16+zlib.MAX_WBITS) fh = open(''abc.gz'', ''rb'') cdata = fh.read() fh.close() data = do.decompress(cdata)

arroja este error:

zlib.error: Error -3 while decompressing: incorrect header check

¿Cómo puedo superarlo?


Curiosamente, tuve ese error al intentar trabajar con la API de desbordamiento de pila utilizando Python.

GzipFile que funcionara con el objeto GzipFile desde el directorio gzip, más o menos así:

import gzip gzip_file = gzip.GzipFile(fileobj=open(''abc.gz'', ''rb'')) file_contents = gzip_file.read()


Mi caso fue descomprimir los mensajes de correo electrónico que están almacenados en la base de datos de Bullhorn. El fragmento es el siguiente:

import pyodbc import zlib cn = pyodbc.connect(''connection string'') cursor = cn.cursor() cursor.execute(''SELECT TOP(1) userMessageID, commentsCompressed FROM BULLHORN1.BH_UserMessage WHERE DATALENGTH(commentsCompressed) > 0 '') for msg in cursor.fetchall(): #magic in the second parameter, use negative value for deflate format decompressedMessageBody = zlib.decompress(bytes(msg.commentsCompressed), -zlib.MAX_WBITS)



Tienes este error:

zlib.error: Error -3 while decompressing: incorrect header check

Lo más probable es que esté intentando verificar los encabezados que no están allí, por ejemplo, sus datos siguen a RFC 1951 (formato comprimido deflate ) en lugar de RFC 1950 (formato comprimido zlib ) o RFC 1952 (formato comprimido gzip ).

Elegir WindowBits

Pero zlib puede descomprimir todos esos formatos:

  • para (des) comprimir el formato de deflate , use wbits = -zlib.MAX_WBITS
  • para (des) comprimir el formato zlib , use wbits = zlib.MAX_WBITS
  • para (des) comprimir el formato gzip , use wbits = zlib.MAX_WBITS | 16 wbits = zlib.MAX_WBITS | 16

Consulte la documentación en http://www.zlib.net/manual.html#Advanced (sección inflateInit2 )

ejemplos

datos de prueba:

>>> deflate_compress = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS) >>> zlib_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS) >>> gzip_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16) >>> >>> text = ''''''test'''''' >>> deflate_data = deflate_compress.compress(text) + deflate_compress.flush() >>> zlib_data = zlib_compress.compress(text) + zlib_compress.flush() >>> gzip_data = gzip_compress.compress(text) + gzip_compress.flush() >>>

prueba obvia para zlib :

>>> zlib.decompress(zlib_data) ''test''

prueba de deflate :

>>> zlib.decompress(deflate_data) Traceback (most recent call last): File "<stdin>", line 1, in <module> zlib.error: Error -3 while decompressing data: incorrect header check >>> zlib.decompress(deflate_data, -zlib.MAX_WBITS) ''test''

prueba para gzip :

>>> zlib.decompress(gzip_data) Traceback (most recent call last): File "<stdin>", line 1, in <module> zlib.error: Error -3 while decompressing data: incorrect header check >>> zlib.decompress(gzip_data, zlib.MAX_WBITS|16) ''test''

Los datos también son compatibles con el módulo gzip :

>>> import gzip >>> import StringIO >>> fio = StringIO.StringIO(gzip_data) >>> f = gzip.GzipFile(fileobj=fio) >>> f.read() ''test'' >>> f.close()

Detección automática de encabezado (zlib o gzip)

agregar 32 a windowBits activará la detección de encabezado

>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|32) ''test'' >>> zlib.decompress(zlib_data, zlib.MAX_WBITS|32) ''test''

usando gzip lugar

o puede ignorar zlib y usar el módulo gzip directamente; pero recuerda que bajo el capó , gzip usa zlib .

fh = gzip.open(''abc.gz'', ''rb'') cdata = fh.read() fh.close()


Actualización : la respuesta de dnozay explica el problema y debe ser la respuesta aceptada.

Pruebe el módulo gzip , el código a continuación es directamente de los documentos de Python .

import gzip f = gzip.open(''/home/joe/file.txt.gz'', ''rb'') file_content = f.read() f.close()