zipfile模块完全不支持创建密码保护的zip文件,仅支持读取;必须借助subprocess调用7z或zip等外部工具实现加密压缩。

zipfile 模块本身不支持创建密码保护的 ZIP 文件
Python 标准库的 zipfile 模块能读取带密码的 ZIP(用 ZipFile.extractall(pwd=...)),但**完全不支持写入加密 ZIP**。调用 setpassword() 或传入 pwd 参数到 write() / writepy() 都无效,也不会报错——只是静默忽略密码逻辑。这是标准库的明确限制,不是你用错了参数。
常见错误现象:
– 代码看似执行成功,生成的 ZIP 文件双击解压时无需密码
– 用 unzip -t 或 7-Zip 检查,显示“Encryption: None”
– 尝试用 ZipFile 读取自己刚写的“加密”包,不传 pwd 也能直接解压
真正可行的替代方案:调用系统命令(如 7z 或 zip)
最稳定、跨平台且兼容性好的方式是绕过 zipfile,改用 subprocess 调用外部压缩工具。前提是目标环境已安装对应命令行工具:
- Linux/macOS:推荐
zip命令(需安装zip包,支持传统 ZIP encryption) - Windows/Linux/macOS:推荐
7z(来自 7-Zip,支持 AES-256 加密,安全性更高)
示例(使用 7z):
import subprocess
import os
<p>def create_encrypted_zip(output_path, file_list, password):
cmd = [
"7z", "a", "-p" + password, "-mhe=on", output_path
] + file_list
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
raise RuntimeError(f"7z failed: {result.stderr}")</p><h1>用法</h1><p>create_encrypted_zip("secret.7z", ["doc.txt", "data.csv"], "my_pass_123")
</p>
注意:-mhe=on 启用文件头加密(否则仅文件内容加密,文件名仍可见);7z 默认输出 .7z 格式,若坚持要 .zip 扩展名,可加 -tzip,但 ZIP 格式下 7z 仍只支持传统加密(非 AES),安全性弱于 .7z。
不要尝试用纯 Python 实现 ZIP 加密
有人试图用 pyminizip、pyzipper 等第三方库,但需特别注意:
-
pyminizip底层调用 zlib + minizip C 库,Windows 上常因编译问题安装失败;macOS M1/M2 可能触发架构兼容问题 -
pyzipper支持 AES 加密,但**只适用于读取已有 AES ZIP**,其WriteZipFile类写入时仍依赖底层 C 库,且文档明确警告“写入 AES ZIP 不被所有解压器支持”(例如 macOS 原生归档工具打不开) - 所有纯 Python 方案在处理大文件时内存占用高,且缺乏对多线程/进度反馈的支持
简单说:除非你完全控制解压端(比如只在自己的 Python 程序里读),否则别指望用这些库生成一个“通用可解”的密码 ZIP。
如果必须用 ZIP 格式且需 AES,优先选 7z 命令行 + -tzip
虽然 ZIP 规范对 AES 支持不统一,但 7z a -tzip -p"xxx" -mem=AES256 生成的 ZIP,在 Windows 解压软件(Bandizip、WinRAR)、7-Zip、Linux 的 unzip(需 6.0+ 版本)中基本可用。关键点:
- 务必加
-mem=AES256(否则默认用弱的传统加密) - 避免用空格或特殊字符作密码,某些 unzip 实现会解析失败
- 路径含中文时,确保终端编码与 7z 一致(Linux/macOS 通常 UTF-8,Windows 建议用 CMD 的 GBK 或改用 PowerShell)
没有银弹。所谓“Python 创建密码 ZIP”,本质是 Python 当个调度器,把活交给更专业的工具干。别在 zipfile 上浪费时间找密码参数——它真没有。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











