我在一个名为' 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
你知道为什么会这样,以及如何让它在较低的压缩级别下工作吗?
答案 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?