python zipfile模块似乎没有压缩我的文件


72

我做了一些辅助功能:

import zipfile

def main(archive_list=[],zfilename='default.zip'):
    print zfilename
    zout = zipfile.ZipFile(zfilename, "w")
    for fname in archive_list:
        print "writing: ", fname
        zout.write(fname)
    zout.close()

if __name__ == '__main__':
    main()  

问题是我的所有文件都没有被压缩!文件大小相同,实际上,扩展名已更改为“ .zip”(在本例中为“ .xls”)。

我在winXP sp2上运行python 2.5。

Answers:


148

这是因为ZipFile要求您指定压缩方法。如果未指定,则假定压缩方法为zipfile.ZIP_STORED,该方法仅存储文件而不压缩文件。您需要将方法指定为zipfile.ZIP_DEFLATED。您将需要为此zlib安装模块(通常默认情况下已安装)。

import zipfile

def main(archive_list=[],zfilename='default.zip'):
    print zfilename
    zout = zipfile.ZipFile(zfilename, "w", zipfile.ZIP_DEFLATED) # <--- this is the change you need to make
    for fname in archive_list:
        print "writing: ", fname
        zout.write(fname)
    zout.close()

if __name__ == '__main__':
    main()  

36
多么可怕的默认!为什么?!
gabe 2014年

9
因为该zlib模块并非总是可用,尤其是在沙盒安装中。
Chinmay Kanchi 2014年

6
我在zip文件中遇到了同样的问题。我不得不承认我的错是在尝试python文档中的示例代码之前没有阅读文档。我认为示例代码应包含ZIP_DEFLATED参数,以减少混乱。
marcin_koss 2015年

13

有一种非常简单的压缩 zip格式的方法,

shutil.make_archive库中使用。

例如:

import shutil

shutil.make_archive(file_name, 'zip', file location after compression)

可以在以下位置查看更多详细的文档:


1
感谢您发布此信息。这可以非常轻松地实现文件归档,而无需经历压缩过程。对于需要转储数据以进行记录保存的流程来说,这是一个很好的书挡。我将大约10行代码缩减为3行。
user3507825's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.