Python的zipfile模块有更快的替代方案吗?

21

有没有比Python 2.7.4 zipfile模块(使用ZIP_DEFLATED)更快的替代方案,可以将大量文件压缩为一个zip文件?我看过czipfile https://pypi.python.org/pypi/czipfile/1.0.0,但它似乎只专注于更快的解密(而不是压缩)。

我经常需要处理大量图像文件(约12,000个文件,包括.exr和.tiff文件),每个文件大小在1MB到6MB之间(总共约9GB),以便将它们压缩成一个单独的zip文件进行发货。这个压缩需要大约90分钟的时间来处理(运行在Windows 7 64位操作系统上)。

如果有人能推荐一个不同的Python模块(或者C/C++库,甚至是一个独立的工具),能够在比zipfile模块更短的时间内将大量文件压缩成一个单一的.zip文件,那将非常感谢(任何接近5-10%更快(或更多)的都会非常有帮助)。


5
最坏的情况下,你总是可以调用shell并从Python执行类似7zip的操作。 - Patashu
1
你压缩的图像文件已经使用了它们各自文件格式的压缩版本吗?如果是这样,使用ZIP_DEFLATED而不是ZIP_STORED再次尝试压缩它们可能会浪费大量的处理时间,但收益很小。此外,Python 2和3的文档都说zipfile模块仅支持解密ZIP归档中的加密文件,而不支持创建它们 - 那么你具体是如何做到的呢? - martineau
@Patashu 感谢您的建议,我会尝试并测试性能。这些文件需要是.zip文件,否则我会尝试其他打包格式进行实验。 - michaelhubbard.ca
3
7zip可以压缩和提取zip、7z、bzip2、gzip和许多其他格式的文件。它有可调节的压缩级别/方法相关参数,因此您可以在压缩时间、压缩比和解压时间之间进行权衡选择。 - Patashu
@martineau 您是正确的,该问题不应使用“加密”一词,因为zipfile模块不支持该功能。我应该专注于此问题中的快速压缩(尽管也加密.zip文件的选项将很有用)。图像文件(.exr和.tiff)都应进行压缩,因此ZIP_STORED选项可能会产生差异。我会尝试一下并查看该选项对速度(以及.zip大小)的影响,感谢您的建议。 - michaelhubbard.ca
如果你关心解压缩,请参阅:https://dev59.com/GlTTa4cB1Zd3GeqPrVNM,https://stackoverflow.com/questions/61930445/fast-zip-decryption-in-python,https://dev59.com/jJbfa4cB1Zd3GeqP0ep1 - Albert
1个回答

14

正如Patashu所提到的,将外包给7-zip可能是最好的主意。

以下是一些示例代码,可帮助您入门:

import os
import subprocess

path_7zip = r"C:\Program Files\7-Zip\7z.exe"
path_working = r"C:\temp"
outfile_name = "compressed.zip"
os.chdir(path_working)

ret = subprocess.check_output([path_7zip, "a", "-tzip", outfile_name, "*.txt", "*.py", "-pSECRET"])

正如martineau所提到的,你可以尝试使用压缩方法。这个页面提供了一些更改命令行参数的示例。


1
感谢大家的帮助。将外包压缩任务给7-zip(在1GB子集的.exr文件上)确实比zipfile压缩快了近52%,这真的很棒。我仍在运行一些测试,比较@martineau建议的未压缩版本和7zip的调整设置,但看起来7zip解决方案肯定会有所改善。 - michaelhubbard.ca
1
@michaelhubbard.ca:使用7-Zip是一个不错的选择,它是这种情况下的绝佳工具。请注意,它有一个仅限命令行的版本叫做7za.exe,大小只有574 KB,可能是你所需要的全部。此外,请在某个地方添加评论,让我们知道仅存储与压缩存储的区别。 - martineau
@michaelhubbard.ca:我忘了提到7-Zip还有非常好的加密选项,因为你说你对这个选项感兴趣。 - martineau
1
@martineau 谢谢您的跟进和额外信息。存储(未压缩)zipfile 的时间也是一个显着的改进(比zipfile压缩版本快约38%),生成的归档文件大小仅比压缩版本大约3%。再次感谢您的帮助。 - michaelhubbard.ca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接