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



问题

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

示例代码

这段代码演示了行为,假设您当前的工作目录中有"test.bz2"one_answers"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()

显示以下回溯:

追踪(最近一次通话):
 nbsp;文件"zip_test.py",第10行,位于
 nbsp nbsp;gz.seek(0,os.seek_END)
 nbsp;文件"/usr/lib64/python2.6/gzip.py",第420行,位于seek中
 nbsp nbsp;raise ValueError("不支持从末尾开始周")
ValueError:不支持从末端搜索

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

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

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

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

最新更新