2017-01-13 91 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之間(包括1和7)的任何數字時,最後一行將失敗並顯示IOError:無效數據流。如果我使用順序解壓縮器,則會發生同樣的情況。但是,如果我加入了字符串連接爲一個長字符串,並使用一次性壓縮器功能,它工作正常:

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

你知道爲什麼會以及如何使其在較低的壓縮級別的工作?

回答

1

您正在丟棄由compressor.compress(l)返回的壓縮數據...... docs說:「如果可能,返回一大塊壓縮數據,否則返回一個空字節串。」你需要做這樣的事情:

# 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 

另外請注意,您的單穩代碼使用"\n".join() ...檢查這對分塊的結果,使用"".join()

而且提防字節/ STR問題例如以上應該是b"whatever".join()

你使用的是什麼版本的Python?

+0

啊,我明白了。我錯過了compress函數返回部分結果而不是flush()一次的事實。有趣的是,8或9的compressionLevel永遠不會達到部分結果已準備就緒 - 如果我正在測試另一組文檔,這種差異甚至可能不會顯示出來! – thornate