不能。python标准库zipfile模块不支持加密压缩,调用write()传入pwd参数会抛出notimplementederror;真正可用方式仅有pyminizip等第三方库封装c库,或调用7z/winrar等外部命令。

ZipFile 能不能直接加密压缩整个文件夹?
不能。标准 zipfile 模块(Python 3.8+)仅支持 ZIP_DEFLATED 和 ZIP_STORED,不原生支持 AES 加密或传统 ZIP 密码(即 WinRAR/7-Zip 所用的 password-protected ZIP)。调用 ZipFile.write() 时传入 pwd 参数会抛出 NotImplementedError。
真正可用的密码保护方式只有两种:一是用 pyminizip 这类第三方库封装 libminizip;二是调用系统命令(如 7z 或 zip -P),但后者依赖外部环境且跨平台风险高。
用 pyminizip 实现带密码的文件夹压缩
pyminizip 是最轻量、兼容性较好的选择,它基于 C 库,支持 ZIP 2.0 加密(即传统 ZipCrypto,非 AES,安全性有限但能被 Windows 资源管理器、macOS 归档实用工具识别)。
安装后使用方式简单:
pip install pyminizip
压缩整个目录的典型写法:
import pyminizip<br>pyminizip.compress("src_folder", "output.zip", "mypassword", 5)
注意几个关键点:
-
"src_folder"是待压缩目录路径(结尾不加斜杠,否则可能多一层空目录) - 第二个参数是输出 ZIP 文件路径,不是目录名
- 密码为字符串,不支持中文(部分版本会静默失败)
- 压缩级别取值 1–9,5 是默认平衡值;设为 0 表示不压缩(仅打包)
- 该函数会递归包含子目录和文件,但不保留空目录(
pyminizip本身不支持空目录)
解压带密码的 ZIP 文件时常见报错
如果用 zipfile.ZipFile 直接解压 pyminizip 生成的加密 ZIP,会遇到 RuntimeError: File "xxx" is encrypted, password required —— 但你没法传密码进去,因为标准模块不支持 ZipCrypto 解密。
必须用 pyminizip 自带的解压函数:
pyminizip.extract("output.zip", "mypassword", "dest_dir")
或者改用更通用的方案:zipfile + pycryptodome 组合只适用于 AES 加密 ZIP(比如 7z 生成的),而 pyminizip 不产生 AES ZIP,所以这条路走不通。
容易踩的坑:
- 解压目标目录
"dest_dir"必须已存在,pyminizip.extract()不自动创建父目录 - 密码错误时抛出
RuntimeError,无具体提示,建议用 try/except 包裹 - Windows 下路径含中文时,
pyminizip3.0+ 版本才基本支持,旧版会乱码或跳过文件
为什么不用 shutil.make_archive?
shutil.make_archive 看起来更“标准”,但它底层调用的就是 zipfile,同样不支持密码。即使你传入 password="xxx" 参数,也会被忽略——这个参数只对 tar 格式有意义(实际也未实现),ZIP 场景下纯属无效字段。
所以别被文档误导。只要没看到明确标注 “supports zip encryption” 的 API,就默认它不支持。
真要 AES 加密,得换工具链:用 subprocess 调用 7z a -p"xxx" archive.zip folder/(Linux/macOS)或 7z.exe(Windows),并确保用户机器装了 7-Zip。这条路可控性高,但把依赖从 Python 移到了外部二进制程序——部署时最容易被忽略的就是这个前提。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











