python 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()
if __name__ == '__main__':
main()
问题是我所有的文件都没有被压缩!文件的大小没有变化,实际上只是文件的扩展名从“.xls”变成了“.zip”。
我在winXP sp2上运行的是python 2.5。
3 个回答
有一种非常简单的方法可以压缩成 zip
格式,
可以使用 shutil.make_archive
这个库。
比如说:
import shutil
shutil.make_archive(file_name, 'zip', file location after compression)
想要了解更多详细的说明,可以查看这里: 这里
希望这些内容能对某些人有所帮助。
我测试了所有的压缩模式,并在两个数据集上进行了基准测试。第一个数据集比较小(大约30 MB),第二个数据集比较大(大约1.5 GB)。这两个数据集包含了各种类型的文件,尽量模拟真实的使用场景。我对每个数据集进行了两种测试方法:一种是“按比例”的,另一种是“完整”的。每种测试都重复了三次,以便得到一个平均值。结果可能会因你的机器而异,但我觉得这些数据还是个不错的起点。
我之所以用两种方法测试,是因为我想制作一个专门的备份解决方案。
按比例的方法会生成更多的压缩文件,但如果需要的话,它让我可以传输更小的数据包,比如只替换那些改变过的内容。虽然这比这更复杂,但现在不重要。
完整的方法就是直接压缩整个文件夹。
压缩比的计算方式是:
size_difference = source_size - compressed_size
compression_ratio = (size_difference * 100.0) / source_size
简单来说,这个数字越高越好。
每个压缩档案都是这样初始化的:
# 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就足够了。再提高压缩级别对最终文件大小没有显著影响。如果工作负载需要很多“小”压缩文件,使用级别9会更好。它提供了高压缩比,但所需时间与级别1差不多。
这是因为 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()
更新:根据 文档(python 3.7),你需要为 'compression' 参数指定一个值,以覆盖默认的 ZIP_STORED。可用的选项有 ZIP_DEFLATED、ZIP_BZIP2 或 ZIP_LZMA,相应的库 zlib、bz2 或 lzma 也应该可用。