0

我在名为“行”的列表中有一系列字符串,我将它们压缩如下:

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: invalid data stream。如果我使用顺序解压缩器,也会发生同样的情况。但是,如果我将字符串连接成一个长字符串并使用一次性压缩器功能,它可以正常工作:

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

您知道为什么会这样以及如何使其在较低的压缩级别下工作吗?

4

1 回答 1

1

您正在丢弃由compressor.compress(l)...返回的压缩数据,文档说“如果可能,则返回一块压缩数据,否则返回一个空字节字符串。” 你需要做这样的事情:

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

还要注意字节/字符串问题,例如上面应该是b"whatever".join().

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

于 2017-01-13T22:54:09.803 回答