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 是什么版本?
我在名为 '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 是什么版本?