问题
我正在 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 是一个 block 压缩器,每个 block 都是独立的。
如果你真的想要随机访问一个 gzip 文件,那么写一个包装器来解压缩内容并返回一个提供查找的缓冲区。不幸的是,这会破坏您问题链接中提到的优化。
关于python - 为什么允许从文件末尾查找 BZip2 文件而不是 Gzip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25734252/