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)
Simplemente agregue los encabezados ''Aceptar-codificación'': ''identidad''
import requests
requests.get(''http://gett.bike/'', headers={''Accept-Encoding'': ''identity''})
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
, usewbits = -zlib.MAX_WBITS
- para (des) comprimir el formato
zlib
, usewbits = zlib.MAX_WBITS
- para (des) comprimir el formato
gzip
, usewbits = 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()