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: