我在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文件?
答案 0 :(得分:4)
简单来说,gzip是一个流压缩器,这意味着每个压缩元素都依赖于前一个压缩元素。寻求是没有意义的,因为无论如何整个文件都必须被解压缩。可能gzip.py的作者认为提出错误而不是静默解压缩文件更好,这样用户就可以意识到搜索效率低下。
另一方面,bzip2是块压缩器,每个块都是独立的。
如果你真的想随机访问一个gzip压缩文件,那么写一个解压缩内容的包装器并返回一个提供搜索的缓冲区。不幸的是,这会破坏您问题链接中提到的优化。