问题
我在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压缩文件,那么写一个解压缩内容的包装器并返回一个提供搜索的缓冲区.不幸的是,这会破坏您的问题链接中提到的优化.