python zipfile模块没有';我好像没有压缩我的文件

python zipfile模块没有';我好像没有压缩我的文件,python,compression,zipfile,Python,Compression,Zipfile,我制作了一个小助手函数: 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()

我制作了一个小助手函数:

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。

这是因为
ZipFile
要求您指定压缩方法。如果不指定它,它将假定压缩方法为
zipfile.ZIP\u STORED
,它只存储文件而不压缩它们。您需要将方法指定为
zipfile.ZIP\u DEFLATED
。您需要为此安装
zlib
模块(通常默认情况下安装)

导入zipfile
def main(archive_list=[],zfilename='default.zip'):
打印zfilename

zout=zipfile.zipfile(zfilename,“w”,zipfile.ZIP_DEFLATED)#压缩
ZIP
格式非常简单

shutil.make_存档库中使用

例如:

import shutil

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

您可以在以下位置查看更广泛的文档:

希望这对其他人有用。 我测试了所有zip模式,并在两个数据集上对它们进行了基准测试。第一个较小(~30MB),另一个较大(~1.5GB)。它们由各种类型的文件组成,因此尽可能接近真实场景。我对每个数据集进行了两种测试方法:“比例”测试和“完全”测试。两个测试都是一个接一个地重复3次以获得平均值。这些结果可能因您的机器而异,但我认为这仍然是一个很好的起点

我用两种方法进行了测试,因为我正在尝试制作自己的专用备份解决方案。 比例法创建了更多的zip文件,但它允许我在必要时传输更小的数据包,例如,只替换已更改的内容。这比那更复杂,但现在并不重要

完整的方法就是直接压缩整个文件夹

压缩比计算:

大小差异=源大小-压缩大小

压缩比=(大小之差*100.0)/源大小

基本上,这个数字越高越好

每个zip归档文件的初始化方式如下:

# Mode tests
with zipfile.ZipFile(target_zip, 'w', compression_method) as ziph:

# Level tests
with zipfile.ZipFile(target_zip, 'w', compression_method, compresslevel=level) as ziph:
结果如下:

似乎无论采用哪种方法,最佳压缩模式都是ZIP_-DEFLATED。 唯一较小的归档文件大小为我提供了ZIP_LZMA模式,但它只占%的一小部分,而且对于大型数据集,它所用的时间大约要长8倍

此外,我用相同的数据集和方法尝试了不同级别的压缩。除了这次,每个级别只有一次运行


看起来ZIP_DEFLATED和ZIP_BIP2具有类似的压缩能力,但第二个压缩速度要慢得多。对于大型数据集,1或2的压缩级别应该足够了。如果将其增加得更多,则不会对最终文件大小产生显著影响。如果工作负载需要大量“小”zip文件,则最好使用级别9。它提供了很高的压缩比,但所需时间与级别1相当。

多么糟糕的默认设置!为什么?因为
zlib
模块并不总是可用的,特别是在沙盒安装中。我遇到了与zip文件相同的问题。我必须承认我的错误是在尝试python文档中的示例代码之前没有阅读文档。我认为示例代码应该包括ZIP_DEFLATED参数,以减少混淆。感谢发布此消息。这可以非常轻松地实现文件归档,而无需经过压缩。对于需要转储数据以保存记录的流程来说,这是一个很好的簿记工具。我用这个把10行代码合并成3行。
# Mode tests
with zipfile.ZipFile(target_zip, 'w', compression_method) as ziph:

# Level tests
with zipfile.ZipFile(target_zip, 'w', compression_method, compresslevel=level) as ziph: