为什么从文件末尾搜索允许BZip2文件而不是Gzip文件?

时间:2014-09-08 22:51:20

标签: python gzip bzip2

问题

我在Python 2.7.6中解析大型压缩文件,并想在启动之前知道未压缩的文件大小。我正在尝试使用this SO answer中提出的第二种技术。它适用于bzip2格式的文件,但不适用于gzip格式的文件。导致这种情况的两种压缩算法有什么不同?

示例代码

此代码剪辑演示了该行为,假设您当前的工作目录中存在“test.bz2”和“test.gz”:

import os
import bz2
import gzip

bz = bz2.BZ2File('test.bz2', mode='r')
bz.seek(0, os.SEEK_END)
bz.close()

gz = gzip.GzipFile('test.gz', mode='r')
gz.seek(0, os.SEEK_END)
gz.close()

显示以下回溯:

  

追踪(最近的呼叫最后):
  文件“zip_test.py”,第10行,在中   gz.seek(0,os.SEEK_END)
  文件“/usr/lib64/python2.6/gzip.py”,第420行,在搜索中   提出ValueError('不支持结束')   ValueError:从最终不支持

为什么这适用于* .bz2文件但不适用于* .gz文件?

1 个答案:

答案 0 :(得分:4)

简单来说,gzip是一个流压缩器,这意味着每个压缩元素都依赖于前一个压缩元素。寻求是没有意义的,因为无论如何整个文件都必须被解压缩。可能gzip.py的作者认为提出错误而不是静默解压缩文件更好,这样用户就可以意识到搜索效率低下。

另一方面,bzip2是块压缩器,每个块都是独立的。

如果你真的想随机访问一个gzip压缩文件,那么写一个解压缩内容的包装器并返回一个提供搜索的缓冲区。不幸的是,这会破坏您问题链接中提到的优化。