2017-01-13 65 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