Python BZ2 压缩器 - compress() 没有返回任何内容

2 投票
1 回答
1028 浏览
提问于 2025-04-17 06:56

我正在尝试使用Python的bz2compressor类来压缩一个数据流。

文档上说,bz2compressor.compress()应该在“可能的情况下”返回压缩数据的块,但我什么都没有得到。

我只有在调用flush()时才得到所有的压缩数据(我尝试过的文件都超过2GB),还是没有任何返回。

有没有办法设置内部缓冲区的限制,让它在什么时候返回数据给我呢?

谢谢!

1 个回答

3

我在调用flush()的时候能得到我所有的压缩数据(我试过2GB以上的文件),但还是没有效果。

处理压缩工具有个小窍门。

我敢打赌,你那个2GB以上的文件其实不太随机。随机的数据压缩效果不好,而有规律的数据压缩后能变得非常小。

举个例子:

>>> import bz2
>>> c=bz2.BZ2Compressor()
>>> import string
>>> data = string.printable*1024
>>> len(data)
102400
>>> c.compress(data)
''
>>> result= c.flush()
>>> len(result)
361

提供的数据有一定的规律,这让它压缩得很好。

你需要的是随机数据。

>>> import random
>>> c=bz2.BZ2Compressor()
>>> size= 0
>>> result= ''
>>> while result == '':
...     data = ''.join( random.choice(string.printable) for i in xrange(1024*8) )
...     size += len(data)
...     result= c.compress(data)... 
>>> len(result)
754809
>>> size
901120

当我使用真正随机的数据时,我能得到一些数据块。

撰写回答