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

Ram*_*amy 59 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()

if __name__ == '__main__':
    main()  
Run Code Online (Sandbox Code Playgroud)

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

我在winXP sp2上运行python 2.5.

Chi*_*chi 123

这是因为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()  
Run Code Online (Sandbox Code Playgroud)

  • 真可怕的默认!为什么?! (25认同)
  • 因为`zlib`模块并不总是可用,特别是在沙盒安装中. (7认同)
  • 我在zip文件中遇到了同样的问题。我不得不承认我的错是在尝试从python文档获取示例代码之前没有阅读文档。我认为示例代码应包含ZIP_DEFLATED参数,以减少混乱。 (2认同)

MrJ*_*rJW 16

希望这对某人有用。\n我测试了所有 zip 模式并在两个数据集上对它们进行了基准测试。第一个较小(约 30 MB),另一个较大(约 1.5 GB)。它们由各种类型的文件组成,因此尽可能接近现实生活场景。我对每个数据集做了两种测试方法:\xe2\x80\x9cproportional\xe2\x80\x9d 一种和 \xe2\x80\x9ccomplete\xe2\x80\x9d 一种。两项测试均重复 3 次,取平均值。这些结果可能会因您的机器而异,但我认为它\xe2\x80\x99s仍然是一个很好的起点。

\n

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

\n

比例法解释

\n

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

\n

完整方法说明

\n

压缩比计算:

\n
\n

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

\n

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

\n
\n

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

\n

每个 zip 存档的初始化如下:

\n
# Mode tests\nwith zipfile.ZipFile(target_zip, \'w\', compression_method) as ziph:\n\n# Level tests\nwith zipfile.ZipFile(target_zip, \'w\', compression_method, compresslevel=level) as ziph:\n
Run Code Online (Sandbox Code Playgroud)\n

结果如下:

\n

研究成果

\n

看来无论采用哪种方法,最佳的压缩模式都是 ZIP_DEFLATED。\n唯一较小的存档大小给了我 ZIP_LZMA 模式,但它只是 % 的一小部分,并且对于大型数据集花费的时间大约是 8 倍。

\n

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

\n

研究成果

\n

看起来 ZIP_DEFLATED 和 ZIP_BIP2 具有类似的压缩功能,但第二个要慢得多。对于大型数据集,压缩级别 1 或 2 就足够了。增加更多对最终文件大小没有显着影响。如果工作负载需要大量 \xe2\x80\x9csmall\xe2\x80\x9d zip 文件,最好使用级别 9。它提供高压缩比,但所需时间与级别 1 大致相同。

\n


Gav*_*hen 8

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

shutil.make_archive库中使用.

例如:

import shutil

shutil.make_archive(file_name, 'zip', file location after compression)
Run Code Online (Sandbox Code Playgroud)

可以在以下处查看更多文档: