wake-up-neo.com

zlib.error: Fehler -3 beim Dekomprimieren: falsche Headerprüfung

Ich habe eine gzip-Datei und versuche sie über Python wie folgt zu lesen:

import zlib

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

es wirft diesen Fehler:

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

Wie kann ich es überwinden?

47
VarunVyas

Update : dnozays Antwort erklärt das Problem und sollte die akzeptierte Antwort sein.


Probieren Sie das gzip -Modul aus. Der folgende Code stammt direkt aus den Python-Dokumenten .

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

Sie haben diesen Fehler:

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

Dies liegt wahrscheinlich daran, dass Sie versuchen, nicht vorhandene Header zu überprüfen, z. Ihre Daten folgen eher RFC 1951 (deflate komprimiertes Format) als RFC 1950 (zlib komprimiertes Format) oder RFC 1952 (gzip komprimiertes Format).

windowBits auswählen

Aber zlib kann all diese Formate dekomprimieren:

  • verwenden Sie wbits = -zlib.MAX_WBITS, um das Format deflate zu (dekomprimieren).
  • verwenden Sie wbits = zlib.MAX_WBITS, um das zlib -Format zu (dekomprimieren).
  • verwenden Sie wbits = zlib.MAX_WBITS | 16, um das Format gzip zu (dekomprimieren).

Siehe Dokumentation in http://www.zlib.net/manual.html#Advanced (Abschnitt inflateInit2)

beispiele

testdaten:

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

offensichtlicher Test für zlib:

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

test für 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 für 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'

die Daten sind auch mit dem gzip Modul kompatibel:

>>> import gzip
>>> import StringIO
>>> fio = StringIO.StringIO(gzip_data)  # io.BytesIO for Python 3
>>> f = gzip.GzipFile(fileobj=fio)
>>> f.read()
'test'
>>> f.close()

automatische Headererkennung (zlib oder gzip)

das Hinzufügen von 32 zu windowBits löst die Header-Erkennung aus

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

verwenden Sie stattdessen gzip

oder Sie können zlib ignorieren und gzip direkt verwenden. aber bitte denken Sie daran, dass unter der Haube , gzipzlib verwendet.

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

Ich habe gerade das Problem der "falschen Header-Prüfung" beim Dekomprimieren von komprimierten Daten behoben.

Sie müssen -WindowBits => WANT_GZIP in Ihrem Aufruf von inflateInit2 festlegen (verwenden Sie die Version 2)

Ja, das kann sehr frustrierend sein. Bei einem normalerweise geringen Umfang der Dokumentation wird Zlib als API für die Gzip-Komprimierung dargestellt, aber standardmäßig (ohne Verwendung der gz * -Methoden) wird das Gzip-Format nicht erstellt oder dekomprimiert. Sie müssen diese nicht sehr gut dokumentierte Flagge senden.

3
user2475290

Um unvollständige komprimierte Bytes zu dekomprimieren, die sich im Speicher befinden, ist das Antwort von dnozay nützlich, aber es fehlt der zlib.decompressobj - Aufruf, den ich für notwendig befunden habe:

incomplete_decompressed_content = zlib.decompressobj(wbits=zlib.MAX_WBITS | 16).decompress(incomplete_gzipped_content)

Beachten Sie, dass zlib.MAX_WBITS | 1615 | 16 Ist, also 31. Hintergrundinformationen zu wbits finden Sie unter zlib.decompress .


Gutschrift: Antwort von Yann Vernier der den zlib.decompressobj - Aufruf vermerkt.

1
Acumenus

Mein Fall war es, E-Mails zu dekomprimieren, die in der Bullhorn-Datenbank gespeichert sind. Das Snippet ist das folgende:

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)
1
Yury Bondarau

Witzigerweise hatte ich diesen Fehler, als ich versuchte, mit der Stack Overflow-API unter Verwendung von Python zu arbeiten.

Ich habe es geschafft, es mit dem Objekt GzipFile aus dem gzip-Verzeichnis zum Laufen zu bringen, ungefähr so:

import gzip

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

file_contents = gzip_file.read()
0
Paul D. Waite