zipfile.ZipFile不支持AES加密解压,仅从Python 3.9起支持ZIP 2.0传统加密;遇compress_type==99必须改用7z命令行或pyminizip(仅加密),且需注意密码编码一致性。

zipfile.ZipFile不支持密码解压
Python标准库的zipfile模块从3.9开始才通过pwd参数支持ZIP 2.0传统加密(即WinZip老式加密),但对AES加密完全无能为力。你如果用ZipFile.extractall(pwd=b'123')报RuntimeError: AES encrypted ZIPs are not supported,说明压缩包用了现代加密方式——这不是你代码写错了,是zipfile压根没实现它。
常见错误现象包括:
- 传入正确密码仍提示
Bad password for file - 解压后文件内容乱码或损坏
-
ZipFile.read()直接抛RuntimeError
改用pyminizip或7z命令行(推荐)
真正能处理AES加密ZIP的方案只有两个:调用系统级工具(如7-Zip),或用第三方库pyminizip(注意它只支持加密,不支持解密)。所以实际解压必须换路子:
- Windows/macOS/Linux均可用
7z命令行:7z x archive.zip -p"password" -o./output - Python中用
subprocess.run调用它,比折腾纯Python方案更稳 - 若必须纯Python,
pyminizip无法解密,别试;zipfile只能碰运气——仅当确认是传统加密时才用pwd参数
示例(安全调用7z):
立即学习“Python免费学习笔记(深入)”;
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
import subprocess
result = subprocess.run(
['7z', 'x', 'secret.zip', '-pMyPass123', '-o./unpacked'],
capture_output=True,
text=True
)
if result.returncode != 0:
print("解压失败:", result.stderr)
如何判断ZIP用的是哪种加密?
光看文件扩展名没用,得查压缩包内部标记。用zipfile读取filelist并检查flag_bits:
- 若
zf.filelist[0].flag_bits & 0x1为True → 有密码(但不知类型) - 若
zf.filelist[0].compress_type == 99→ AES加密(zipfile直接拒绝) - 若
zf.filelist[0].compress_type in (0, 8)且flag_bits & 0x1为True → 可能是传统加密,可试pwd
注意:compress_type == 99是AES最可靠的信号,遇到就别浪费时间在zipfile上了。
密码含中文或特殊字符怎么办?
7z命令行默认按系统编码读密码,Windows下常是GBK,Linux/macOS是UTF-8。如果密码是中文,-p"密码"可能失效:
- 先用
chcp 65001(Windows)切到UTF-8终端再执行 - 或把密码写进文本文件,用
-p@pwd.txt方式传递 - Python调用时,确保
subprocess.run的encoding参数与终端一致
这步容易被忽略——密码没错,只是编码错位导致7z收不到正确字节。
解压带密码的ZIP不是“选对函数就行”的事,关键在识别加密类型再匹配工具链。AES加密的ZIP,zipfile就是个摆设,硬刚只会卡在RuntimeError里。

















