Python的zipfile模块不压缩文件

7

我在Python中遇到了压缩问题。 我知道在写入时应该调用ZIP_DEFLATED方法来使zip文件压缩,但这对我不起作用。 我有3个PDF文档在C:zip目录中。 当我运行以下代码时,一切正常:

import os,sys
list = os.listdir('C:\zip')
file = ZipFile('test.zip','w')
for item in list:
    file.write(item)
file.close()

它生成的test.zip文件没有压缩。当我将第四行更改为以下内容时:
file = ZipFile('test.zip','w', compression = ZIP_DEFLATED)

它还可以在不压缩的情况下生成test.zip文件。 我也尝试更改写入方法,给它compress_ type参数:

file.write(item, compress_type = ZIP_DEFLATED)

但这也行不通。 我使用的是Python版本2.7.4,操作系统为Win7。 我在另一台电脑上(同样的环境,Win7和Python 2.7.4)尝试了这段代码,它成功地将test.zip文件压缩了。 我知道zlib模块应该是可用的,当我运行以下代码时:

import zlib

即使zlib模块有问题,顶部的代码也应该返回错误信息,但它没有返回任何错误,因此我怀疑zlib不是问题所在。


你是如何检查终止的 zip 文件是否已经被压缩或未压缩创建的? - Amber
Zipfile 构造函数的文档中指出:“如果指定了 ZIP_DEFLATED 但未安装 zlib 模块,则还会引发 RuntimeError。” 因此,如果没有出现错误,它应该可以正常工作。请注意,在 write() 调用中不需要指定 compress_type 关键字参数,除非您想覆盖构造函数给出的 compression 参数的值。 - martineau
2个回答

17

默认情况下,ZIP模块仅存储数据,若要对其进行压缩,请执行以下步骤:

import zipfile
try:
    import zlib
    mode= zipfile.ZIP_DEFLATED
except:
    mode= zipfile.ZIP_STORED

zip= zipfile.ZipFile('zipfilename', 'w', mode)
zip.write(item)
zip.close()

很遗憾,这也不起作用。 模式变量返回“8”,因此它成功地将模式设置为ZIP_DEFLATED,但zipfile仍然太大。 - user2665140
仍然太大,是压缩得不好还是根本没有压缩? - Gustavo Vargas
抱歉,现在看起来似乎可以工作了。之前在尝试使用其他文件时,我在代码中犯了一个错误。 此后,我只使用了这三个PDF文档,并且压缩文件的大小几乎与这三个PDF文档的大小相同,因此我认为压缩仍未生效。 感谢您的帮助! - user2665140
好的,不用谢!如果您认为这是对您问题的有效回答,那么将其标记为已接受会很好! - Gustavo Vargas
1
ZIP_STORED 默认设置是什么?!?! D:哇!谢谢您澄清这一点!7zip 可以制作更小的压缩包。 - ewerybody

0
如果你跟我一样来到这里,我会补充一些内容。 如果你使用 ZipInfo 对象,它们总是覆盖在创建 ZipFile 时指定的压缩方法,然后该方法将变得无用。
所以,要么你设置它们的压缩方法(构造函数上没有参数,你必须设置属性),要么在调用write(或writestr)时指定压缩方法。
import zlib
from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED

def write_things():
    zip_buffer = io.BytesIO()
    with ZipFile(file = zip_buffer, mode = "w", compression = ZIP_DEFLATED) as zipper:
        # Get some data to write
        fname, content, zip_ts = get_file_data()
        file_object = ZipInfo(fname, zip_ts)
        zipper.writestr(file_object, content)   # Surprise, no compression

#       This is required to get compression
#       zipper.writestr(file_object, content, compress_type = ZIP_DEFLATED)

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