【问题标题】:python zipfile module doesn't seem to be compressing my filespython zipfile 模块似乎没有压缩我的文件
【发布时间】:2011-05-09 03:54:48
【问题描述】:

我做了一个小辅助函数:

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。

【问题讨论】:

    标签: python compression zipfile


    【解决方案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()  
    

    更新:根据documentation (python 3.7),应指定“压缩”参数的值以覆盖默认值,即 ZIP_STORED。可用的选项有 ZIP_DEFLATED、ZIP_BZIP2 或 ZIP_LZMA,相应的库 zlib、bz2 或 lzma 应该可用。

    【讨论】:

    • 多么糟糕的默认设置!为什么?!
    • 因为zlib 模块并不总是可用,尤其是在沙盒安装中。
    • 我在使用 zip 文件时遇到了同样的问题。我不得不承认我的错是在尝试 python 文档中的示例代码之前没有阅读文档。我认为示例代码应该包含 ZIP_DEFLATED 参数以减少混淆。
    • 如果在写入 ZipFile 时使用ZipInfo(),则还必须设置zip_info.compress_type = ZIP_DEFLATED
    • @JosteinL - 太棒了!谢谢!
    【解决方案2】:

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

    shutil.make_archive 库中使用。

    例如:

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

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

    【讨论】:

    • 感谢您发布此信息。这可以很容易地实现文件的归档,而无需经过压缩的过程。对于需要转储数据以保存记录的流程来说,这是一个很好的书挡。我用这个将大约 10 行代码合并为 3 行。
    【解决方案3】:

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

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

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

    压缩比计算:

    size_difference = source_size -compressed_size

    compression_ratio = (size_difference * 100.0) / source_size

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

    每个 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 大致相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多