Python ZipFile模块提取密码保护的压缩文件速度慢

6 投票
2 回答
3621 浏览
提问于 2025-04-19 04:05

我正在尝试写一个Python脚本,用来解压一个zip文件:

设备:Beagle-Bone black ~ 1GHz Arm-Cortex-a8,操作系统是debian wheezy

压缩文件:/home/milo/my.zip,约8 MB

>>> from zipfile import ZipFile
>>> zip = ZipFile("/home/milo/my.zip")
>>> zip.extractall(pwd="tst")

其他一些方法,比如打开、读取、写入zip文件,甚至提取特定文件,效果都是一样的。解压的过程大约需要3到4分钟。

而用普通的解压工具解压同一个文件,只需要不到2秒钟。

有没有人知道我的代码或者Python的zipfile库出了什么问题?

谢谢,Ajava

2 个回答

1

这是我在回答中的一部分 https://stackoverflow.com/a/72513075/10860732

说实话,Python没有用纯C语言实现zip解密这件事真是有点傻。

所以我用cython做了这个,速度快了17倍。

你只需要从这个链接下载dezip.pyx和setup.py。

https://gist.github.com/zylo117/cb2794c84b459eba301df7b82ddbc1ec

然后安装cython并构建一个cython库。

pip3 install cython
python3 setup.py build_ext --inplace

接着在原来的脚本中加上两行代码就可以运行了。

import zipfile

# add these two lines
from dezip import _ZipDecrypter_C
setattr(zipfile, '_ZipDecrypter', _ZipDecrypter_C)

z = zipfile.ZipFile('./test.zip', 'r')
z.extractall('/tmp/123', None, b'password')
7

这似乎是Python 2.7中的ZipFile模块一个已知的问题。如果你查看ZipFile的文档,里面明确提到:

解密速度非常慢,因为它是用Python写的,而不是用C语言。

如果你需要更快的速度,可以选择在你的代码中调用一个外部程序(比如unzip或7zip),或者确保你处理的压缩文件没有密码保护。

撰写回答