python - support - zlib.error: errore-3 durante la decompressione: controllo dell'intestazione errato




zlib support (4)

Basta aggiungere le intestazioni "Accept-Encoding": "identity"

import requests

requests.get('http://gett.bike/', headers={'Accept-Encoding': 'identity'})

https://github.com/requests/requests/issues/3849

https://code.i-harness.com

Ho un file gzip e sto cercando di leggerlo tramite Python come di seguito:

import zlib

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

genera questo errore:

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

Come posso superarlo?


Hai questo errore:

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

Il che è più probabile perché stai cercando di controllare le intestazioni che non ci sono, ad esempio i tuoi dati seguono RFC 1951 ( deflate formato compresso) piuttosto che RFC 1950 (formato compresso zlib ) o RFC 1952 (formato compresso gzip ).

scegliere windowBits

Ma zlib può decomprimere tutti questi formati:

  • per (de-) comprimere il formato deflate , usa wbits = -zlib.MAX_WBITS
  • per (de-) comprimere il formato zlib , utilizzare wbits = zlib.MAX_WBITS
  • per (de-) comprimere il formato gzip , utilizzare wbits = zlib.MAX_WBITS | 16 wbits = zlib.MAX_WBITS | 16

Vedi documentazione in http://www.zlib.net/manual.html#Advanced (sezione inflateInit2 )

esempi

dati di test:

>>> 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()
>>> 

ovvio test per zlib :

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

test per 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'

test per 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'

i dati sono anche compatibili con il modulo gzip :

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

rilevamento automatico delle intestazioni (zlib o gzip)

aggiungendo 32 a windowBits si attiverà il rilevamento dell'intestazione

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

usando invece gzip

oppure puoi ignorare zlib e usare direttamente il modulo gzip ; ma per favore ricorda che sotto il cofano , gzip usa zlib .

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

Il mio caso era di decomprimere i messaggi di posta elettronica memorizzati nel database di Bullhorn. Lo snippet è il seguente:

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)

Stranamente, ho avuto questo errore quando ho provato a lavorare con l'API usando Python.

Sono riuscito a farlo funzionare con l'oggetto GzipFile dalla directory gzip, più o meno come questo:

import gzip

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

file_contents = gzip_file.read()




zlib