web-dev-qa-db-ja.com

zlib.error:解凍中のエラー-3:不正なヘッダーチェック

私はgzipファイルを持っていて、Python以下のようにそれを読み取ろうとしています:

import zlib

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

このエラーがスローされます:

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

どうすれば克服できますか?

47
VarunVyas

Updatednozayの答え は問題を説明しており、受け入れられる答えであるはずです。


gzipモジュールを試してください。以下のコードは python docs から直接のものです。

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

このエラーがあります:

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

あなたがそこにないヘッダー、例えば、データは、RFC 1951deflate圧縮形式)またはRFC 1950zlib圧縮形式)ではなく、RFC 1952gzip圧縮形式)に従います。

windowBitsを選択する

ただし、zlibはこれらすべての形式を解凍できます。

  • deflate形式に(圧縮解除)圧縮するには、wbits = -zlib.MAX_WBITSを使用します
  • zlib形式に(圧縮解除)圧縮するには、wbits = zlib.MAX_WBITSを使用します
  • gzip形式に(圧縮解除)圧縮するには、wbits = zlib.MAX_WBITS | 16を使用します

http://www.zlib.net/manual.html#Advanced のドキュメントを参照してください(セクションinflateInit2

テストデータ:

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

zlibの明らかなテスト:

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

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'

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'

データはgzipモジュールとも互換性があります:

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

自動ヘッダー検出(zlibまたはgzip)

32windowBitsに追加すると、ヘッダー検出がトリガーされます

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

代わりにgzipを使用

または、zlibを無視して、gzipモジュールを直接使用できます。しかし フードの下でgzipzlibを使用することに注意してください。

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

Gzip圧縮されたデータを圧縮解除するときの「不正なヘッダーチェック」問題を解決しました。

InflateInit2の呼び出しで-WindowBits => WANT_GZIPを設定する必要があります(2バージョンを使用)

はい、これは非常にイライラする可能性があります。ドキュメントの一般的な浅い読みは、ZlibをGzip圧縮のAPIとして提示しますが、デフォルトでは(gz *メソッドを使用せずに)Gzip形式を作成または圧縮解除しません。この非常に目立たないフラグを送信する必要があります。

3
user2475290

メモリ内にある不完全なgzip圧縮されたバイトを解凍するには、 answer by dnozay は便利ですが、zlib.decompressobj必要だとわかった電話:

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

ご了承ください zlib.MAX_WBITS | 1615 | 16これは31です。wbitsの背景については、 zlib.decompress


クレジット: Yann Vernierによる回答zlib.decompressobj呼び出し。

1
Acumenus

私の場合は、Bullhornデータベースに保存されている電子メールメッセージを解凍することでした。スニペットは次のとおりです。

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

面白いことに、Pythonを使用してStack Overflow APIを操作しようとすると、このエラーが発生しました。

私はgzipディレクトリのGzipFileオブジェクトを使って、大体次のように動作させることができました。

import gzip

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

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