zipfile报badpassworderror是因为只支持zip 2.0传统加密(crc32),不支持aes-128/aes-256等现代加密;密码正确仍失败是因加密方式不兼容,需改用pyzipper、py7zr或调用7z命令行。

用 zipfile 解压带密码的 ZIP 文件时为什么报错 BadPasswordError?
因为 zipfile 默认不支持 AES 加密(只支持传统的 ZIP 2.0 弱加密),而现代工具(如 macOS 归档实用工具、7-Zip、WinRAR)默认用 AES-256 加密 ZIP,zipfile 遇到这类文件会直接抛 BadPasswordError,哪怕密码完全正确。
实操建议:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 先用命令行确认压缩包类型:
file archive.zip—— 若输出含AES encrypted,就不能用纯zipfile - 若确定是传统 ZIP 加密(少见),可用
zipfile.ZipFile.setpassword(),但必须在extractall()前调用,且密码需为bytes类型:zf.setpassword(b"mypass") - 不要尝试用
try/except暴力穷举密码——zipfile对每次失败都做完整解密尝试,极慢且无意义
用 py7zr 解压 AES 加密的 ZIP 或 7z 文件是否可行?
可以,但要注意:ZIP 支持有限。虽然 py7zr 主打 7z 格式,但它底层调用 liblzma 和 libarchive,对 ZIP 的 AES 解密支持依赖编译时是否启用了 libarchive 的 ZIP 插件。实际中更可靠的做法是统一转用 7z 格式生成密码压缩包。
实操建议:
- 安装:
pip install py7zr(推荐 7z 格式,AES-256 全支持) - 解压 7z 文件:
with py7zr.SevenZipFile("a.7z", password="mypass") as zf: zf.extractall(path="./out") - 解压 ZIP 文件前先检查:
py7zr.is_7zfile("a.zip")返回False,不代表不能打开——可强制用SevenZipFile打开,但失败概率高 - 避免混用:不要指望同一段代码通吃 ZIP/7z/AES/非 AES,按格式分路径处理
在 Linux/macOS 上调用 7z 命令行是不是更稳?
是的,这是目前最兼容、最省心的方式。系统级 7z(来自 p7zip 或 7-Zip 官方)对所有主流加密方式(ZIP 传统、ZIP AES、7z AES、RAR)都有成熟支持,且错误提示明确。
实操建议:
- 确保已安装:
7z x archive.zip -pmypass -o./out -y(-y跳过确认) - Python 中调用:
subprocess.run(["7z", "x", "a.zip", "-pmypass", "-o./out", "-y"], check=True, capture_output=True) - 注意空格和特殊字符:密码含空格或
$等 shell 元字符时,不要拼接字符串,直接传 list 参数(上面示例已做到) - 捕获错误:如果
7z返回非零码,subprocess.CalledProcessError会带完整 stderr,里面常有具体原因(如Cannot open encrypted archive表示格式不支持)
Windows 上用 PowerShell 替代 7z 是否靠谱?
不推荐。Windows 自带的 Expand-Archive 完全不支持任何密码,第三方模块如 Microsoft.PowerShell.Archive 也无密码参数。强行用 COM 对象(如 Shell.Application)调用资源管理器解压,会弹窗、无法传密码、不可靠。
实操建议:
- Windows 用户应主动安装
7z(官网下载 7z2409-x64.exe,勾选“添加到系统路径”) - 安装后验证:
7z命令可在 PowerShell/终端中直接运行 - 不要依赖
tar或gzip:它们本身不处理 ZIP 密码,Windows 版 GNU tar 也不支持
archive.zip 到底用什么算法加的密——先用 file 或 7z l -slt archive.zip 看清元数据,再选工具,比硬试三个库强得多。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










