0

クラスを使用して、bz2.BZ2Decompressorbz2 圧縮データのストリームを順次解凍しています。ストリームに切り捨てられた圧縮データが含まれている可能性があります。ファイル全体が解凍された場合と、ファイルの一部のみが解凍された場合を区別できるようにする必要があります。それを確立する方法はありますか?

さらに詳しく説明すると、解凍関数に提供するデータ ストリームは、完全な bz2 圧縮ファイルである場合とそうでない場合があります。切り捨てられる場合があります。この関数を使用すると、データを使用して解凍できる量が返されます。ストリームの終わりに達したかどうかはわかりません。どうすれば同じかを判断できますか? は、ストリームの終わりが見つかったEOFErrorに追加のデータがある場合にのみ発生します。だからそれは私を助けません。

4

1 に答える 1

1

余分な「ジャンク」データをデコンプレッサのdecompress()メソッドに渡すことで、データ ストリームが完了しているかどうかを検出できます。ストリームが完了した場合、EOFError. ストリームがまだ進行している場合、デコンプレッサはジャンクが切り捨てられたストリームの一部であると想定するため、おそらく例外は発生しません。

コード例を次に示します。

import bz2

def decompress(stream):
    decompressor = bz2.BZ2Decompressor()

    # this generator decompresses the data from the iterable stream
    results = "".join(decompressor.decompress(data) for data in stream)

    # now we test to see if it was a complete BZ2 stream
    try:
        decompressor.decompress("\0") # try adding a "junk" null character
    except EOFError: # the stream was complete!
        return results
    except IOError: # the junk may cause an IOError if it hits a BZ2 header
        pass

    # if we reach this point here, the stream was incomplete
    print "Incomplete stream!"
    return None # you may or may not want to throw away the partial results
于 2012-07-05T05:25:24.397 に答える