python - 为什么允许从文件末尾查找 BZip2 文件而不是 Gzip 文件?

标签 python gzip bzip2

问题

我正在 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/

相关文章:

hadoop - 两个串联的 bz2 文件和一个由两个串联文件组成的 bz2 文件有什么区别?

python - 将 bz2 压缩二进制文件导入为 numpy 数组

python - 为什么 Python 的 MIMEMultipart 生成带有换行符的附件文件名?

python - 在 python 中获取树的多个副本的最快方法是什么?

python - 我收到 "AttributeError: module ' Discord.ext.commands' has no attribute 'bot"错误

java - java 中的 mapreduce - gzip 输入文件

python - 使用 python 在 Heroku 上启用压缩

python - 在python中使用bz2.decompress,但答案不同

python - 通过 stripe API 列出所有客户

ios - RestKit 和压缩的 json