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

时间:2010-11-12 15:56:53

标签: 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()  

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

我在winXP sp2上运行python 2.5。

3 个答案:

答案 0 :(得分:112)

这是因为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()  

答案 1 :(得分:6)

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

shutil.make_archive库中使用。

例如:

import shutil

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

可以在Here

查看更详尽的文档

答案 2 :(得分:1)

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

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

The proportional method explanation

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

The complete method explanation

压缩比计算:

<块引用>

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:

结果如下:

research results

看来不管用什么方法,最理想的压缩方式是ZIP_DEFLATED。 唯一较小的存档大小给了我 ZIP_LZMA 模式,但它只是 % 的一小部分,对于大型数据集,它需要大约 8 倍的时间。

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

Research results

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