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

Python bz2 sequential compressor produces invalid data stream on low compression levels

我在名为 '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(含)之间的任何数字时,最后一行将失败并显示 IOError:无效数据流。如果我使用顺序解压缩器,也会发生同样的情况。但是,如果我将字符串连接成一个长字符串并使用一次性压缩器功能,它就可以正常工作:

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

你知道为什么会这样吗?如何让它在较低的压缩级别下工作?

您正在丢弃 compressor.compress(l) 返回的压缩数据 ... 文档说 "Returns a chunk of compressed data if possible, or an empty byte string otherwise." 您需要这样做:

# 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()

还要注意 bytes/str 问题,例如以上应该是 b"whatever".join().

您使用的 Python 是什么版本?