2017-01-13 3 views
0

低圧縮レベルに無効なデータ・ストリームを生成します。PythonのBZ2シーケンシャルコンプレッサーは、私は「行」という名前のリスト内の文字列のシリーズを持っているし、次のように私はそれらを圧縮

import bz2 
compressor = bz2.BZ2Compressor(compressionLevel) 
for l in lines: 
    compressor.compress(l) 
compressedData = compressor.flush() 
decompressedData = bz2.decompress(compressedData) 

がCompressionLevelは、8または9に設定されている場合、これはうまく動作します。 1から7までの任意の数であれば、最終行はIOError:無効なデータストリームで失敗します。シーケンシャルデコンプレッサを使用している場合も同じことが起こります。私は1つの長い文字列に文字列を結合し、ワンショットコンプレッサー機能を使用する場合は、それが正常に動作:これは次のようになり、それが低い圧縮レベルで動作させるためにどのように、なぜ

import bz2 
compressedData = bz2.compress("\n".join(lines)) 
decompressedData = bz2.decompress(compressedData) 
# Works perfectly 

あなたは知っていますか?

答えて

1

compressor.compress(l)によって返された圧縮データを破棄しています... docs say "可能であれば圧縮データのチャンクを返し、それ以外の場合は空のバイト文字列を返します。"あなたはこのような何かを実行する必要があります。

# setup code goes here 
for l in lines: 
    chunk = compressor.compress(l) 
    if chunk: do_something_with(chunk) 
chunk = compressor.flush() 
if chunk: do_something_with(chunk) 
# teardown code goes here 

また、例えばバイト/ STR問題には注意してください。また"".join()

を使用し、チャンク結果に対してこれを確認するために...あなたのワンショットコードが"\n".join()を使用することに注意してください上記はb"whatever".join()である必要があります。

あなたはどのバージョンのPythonを使用していますか?

+0

ああ、わかります。私は、compress関数がflush()ですべてではなく部分的な結果を返すという事実を見逃していました。 8または9のcompressionLevelが、部分的な結果が準備ができているということに決して到達しないことに興味があります。この違いは、別のドキュメントセットでテストしても表示されないことさえあります。 – thornate

関連する問題