Python gzip 模块的压缩级别无法生效

5
我试图使用Python gzip模块将数据写入压缩文件。但是,该模块似乎不接受压缩级别。我按照官方Python文档gzip中指定的语法进行操作。这里有一段示例代码,请纠正我如果我错了。
import gzip
fd = gzip.GzipFile(filename = "temp", mode = "w", compresslevel = 6)
fd.write("some text")

当我在文件temp上运行file命令时,即使不是这种情况,我总是会得到“最大压缩”的输出。
file temp 
temp: gzip compressed data, was "temp", last modified: Tue Jul 30 23:12:29 2013, max compression

1
修复漏洞补丁在此处:https://bugs.python.org/issue27521 - 很快就会进入Python3 :) - Ddorda
2个回答

6

some text太小了,无法进行测试。请使用大字符串进行尝试。

我已经尝试使用一个大的文本文件,结果符合预期。

import gzip
import os

with open('/path/to/big-file', 'rb') as f:
    content = f.read()

for level in range(10):
    with gzip.GzipFile(filename='temp', mode='w', compresslevel=level) as f:
        f.write(content)
    print('level={}, size={}'.format(level, os.path.getsize('temp')))

以上代码产生以下输出:
level=0, size=56564
level=1, size=21150
level=2, size=20635
level=3, size=20291
level=4, size=19260
level=5, size=18818
level=6, size=18721
level=7, size=18713
level=8, size=18700
level=9, size=18702

1
很可能是gzip模块没有将压缩级别写入头文件或类似的地方,但由于该代码块主要输出魔术值,我不确定这是在哪里完成的。 - zigg
应该将for循环缩进到第一个“with”下面,以便内容在范围内。 - nu everest
@nueverest,contentwith语句之外是可用的。我故意这样做是为了尽快关闭文件。 - falsetru

0

元数据可能不正确,但压缩级别设置确实可以正常工作。

dhruv@dhruv:/tmp$ python z.py <-- level 6
dhruv@dhruv:/tmp$ ll temp 
-rw-rw-r-- 1 dhruv dhruv 215903 Jul 30 23:36 temp
dhruv@dhruv:/tmp$ fg
emacs -nw z.py
dhruv@dhruv:/tmp$ python z.py  <--- level 9 
dhruv@dhruv:/tmp$ ll temp 
-rw-rw-r-- 1 dhruv dhruv 215723 Jul 30 23:36 temp

z.py的内容:

import gzip
fd = gzip.GzipFile(filename = "temp", mode = "w", compresslevel = 9)
for i in range(0,100000):
    fd.write(str(i))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接