私は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
どうすれば克服できますか?
Update: dnozayの答え は問題を説明しており、受け入れられる答えであるはずです。
gzip
モジュールを試してください。以下のコードは python docs から直接のものです。
import gzip
f = gzip.open('/home/joe/file.txt.gz', 'rb')
file_content = f.read()
f.close()
このエラーがあります:
zlib.error: Error -3 while decompressing: incorrect header check
あなたがそこにないヘッダー、例えば、データは、RFC 1951
(deflate
圧縮形式)またはRFC 1950
(zlib
圧縮形式)ではなく、RFC 1952
(gzip
圧縮形式)に従います。
ただし、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()
32
をwindowBits
に追加すると、ヘッダー検出がトリガーされます
>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|32)
'test'
>>> zlib.decompress(zlib_data, zlib.MAX_WBITS|32)
'test'
gzip
を使用または、zlib
を無視して、gzip
モジュールを直接使用できます。しかし フードの下で 、gzip
はzlib
を使用することに注意してください。
fh = gzip.open('abc.gz', 'rb')
cdata = fh.read()
fh.close()
Gzip圧縮されたデータを圧縮解除するときの「不正なヘッダーチェック」問題を解決しました。
InflateInit2の呼び出しで-WindowBits => WANT_GZIPを設定する必要があります(2バージョンを使用)
はい、これは非常にイライラする可能性があります。ドキュメントの一般的な浅い読みは、ZlibをGzip圧縮のAPIとして提示しますが、デフォルトでは(gz *メソッドを使用せずに)Gzip形式を作成または圧縮解除しません。この非常に目立たないフラグを送信する必要があります。
メモリ内にある不完全なgzip圧縮されたバイトを解凍するには、 answer by dnozay は便利ですが、zlib.decompressobj
必要だとわかった電話:
incomplete_decompressed_content = zlib.decompressobj(wbits=zlib.MAX_WBITS | 16).decompress(incomplete_gzipped_content)
ご了承ください zlib.MAX_WBITS | 16
は15 | 16
これは31です。wbits
の背景については、 zlib.decompress
。
クレジット: Yann Vernierによる回答zlib.decompressobj
呼び出し。
私の場合は、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)
面白いことに、Pythonを使用してStack Overflow APIを操作しようとすると、このエラーが発生しました。
私はgzipディレクトリのGzipFile
オブジェクトを使って、大体次のように動作させることができました。
import gzip
gzip_file = gzip.GzipFile(fileobj=open('abc.gz', 'rb'))
file_contents = gzip_file.read()