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

问题

我在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()

显示以下回溯:

Traceback (most recent call last):
  File “zip_test.py”, line 10, in
    gz.seek(0, os.SEEK_END)
  File “/usr/lib64/python2.6/gzip.py”, line 420, in seek
    raise ValueError(‘Seek from end not supported’)
ValueError: Seek from end not supported

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

解决方法:

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

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

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

上一篇:python – 将bz2压缩二进制文件导入为numpy数组


下一篇:bzip2 一种块排序文件压缩软件