zlib.erreur: -3 Erreur lors de la décompression: en-tête incorrect vérifier
J'ai un fichier gzip et je suis en train de le lire via Python comme ci-dessous:
import zlib
do = zlib.decompressobj(16+zlib.MAX_WBITS)
fh = open('abc.gz', 'rb')
cdata = fh.read()
fh.close()
data = do.decompress(cdata)
il met cette erreur:
zlib.error: Error -3 while decompressing: incorrect header check
Comment puis-je vaincre?
Vous devez vous connecter pour publier un commentaire.
Mise à jour: dnozay réponse explique le problème et doivent être acceptés réponse.
Essayer le
gzip
module, le code ci-dessous est directement à partir de la python docs.Vous avez ce message d'erreur:
Ce qui est plus probable parce que vous êtes en essayant de vérifier les en-têtes qui ne sont pas là, par exemple, vos données suit
RFC 1951
(deflate
format compressé) plutôt que deRFC 1950
(zlib
format compressé) ouRFC 1952
(gzip
format compressé).choix windowBits
Mais
zlib
pouvez décompresser tous ces formats:deflate
format, l'utilisation dewbits = -zlib.MAX_WBITS
zlib
format, l'utilisation dewbits = zlib.MAX_WBITS
gzip
format, l'utilisation dewbits = zlib.MAX_WBITS | 16
Voir la documentation en http://www.zlib.net/manual.html#Advanced (section
inflateInit2
)exemples
données de test:
évident de test pour
zlib
:test pour
deflate
:test pour
gzip
:les données est également compatible avec
gzip
module:automatique de la tête de détection (zlib ou gzip)
ajoutant
32
àwindowBits
va déclencher tête de détectionà l'aide de
gzip
au lieu deou vous pouvez ignorer
zlib
et l'utilisationgzip
module directement; mais rappelez-vous que sous le capot,gzip
utilisezlib
.zlib.decompress(gzip_data, zlib.MAX_WBITS|32)
zlib.decompress(zlib_data, zlib.MAX_WBITS|32)
tweak qui vous l'avez mentionné, mais il n'a pas fonctionné. J'ai toujours l'incorrect header check
erreur. Si j'ai essayer d'utiliser les autres options mentionnées ci-dessus, je reçois encore des erreurs. Est-il rien d'autre qui pourrait provoquer cette erreur?zlib.MAX_WBITS | 16
a fonctionné pour moi, merci. Il est incroyablement non-trivial d'en déduire ce à partir de la documentation. Aussi, il est ennuyeux queaiohttp
ne pas décoderContent-Encoding: gzip
de manière transparente.Je viens de résoudre le "incorrect d'en-tête cochez la case" problème lors de la décompression de format de données.
Vous avez besoin de régler WindowBits => WANT_GZIP à votre appel à l'inflateInit2 (2 version)
Oui, cela peut être très frustrant. A généralement peu profondes de la lecture de la documentation présente Zlib, comme une API pour la compression Gzip, mais par défaut (ne pas utiliser le gz* méthodes), il n'est pas de créer ou décompresser le format Gzip. Vous devez envoyer cette non-très-bien en évidence documentée drapeau.
Mon cas était pour décompresser les messages électroniques sont stockés dans le Corne de brume de la base de données. L'extrait de code est le suivant:
Curieusement, j'ai eu cette erreur en essayant de travailler avec le Débordement de la Pile de l'API à l'aide de Python.
J'ai réussi à le faire fonctionner avec la
GzipFile
objet de l'gzip répertoire, à peu près comme ceci:Pour décompresser incomplète format d'octets dans la mémoire, le réponse par dnozay est utile, mais il manque le
zlib.decompressobj
appel que j'ai trouvé pour être nécessaire:Noter que
zlib.MAX_WBITS | 16
est15 | 16
qui est de 31. Pour des renseignements sur leswbits
, voirzlib.décompresser
.De crédit: réponse de Yann Vernier qui note le le
zlib.decompressobj
appel.Juste ajouter des en-têtes 'Accept-Encoding': 'l'identité
https://github.com/requests/requests/issues/3849