Python bz2顺序压缩器在低压缩级别上生成无效数据流

时间:2017-01-13 21:29:56

标签: python compression bz2

我在一个名为' lines'的列表中有一系列字符串。我按如下方式压缩它们:

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 个答案:

答案 0 :(得分: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

另请注意,您的oneshot代码使用"\n".join() ...来针对分块结果进行检查,请使用"".join()

还要注意字节/ str问题,例如以上应为b"whatever".join()

您使用的是哪个版本的Python?