如何用Python创建带密码保护的ZIP压缩包?代码问题排查
问题解答
该需求完全可以实现,你的代码问题出在Python标准库zipfile的功能局限和写法疏漏上,具体分析和修复方案如下:
问题原因
1. 标准库zipfile的加密局限性
Python自带的zipfile模块仅支持传统Zip 2.0加密算法,这种加密方式安全性极低,且多数现代解压工具(如Windows默认解压工具、新版WinRAR)默认不识别该加密格式,会直接跳过密码验证,导致你误以为加密未生效。
2. 代码写法的疏漏
即便使用旧式加密,你的代码也未正确触发加密逻辑:setpassword()方法仅用于设置解压时的默认密码,写入文件时并未对内容进行加密。正确的触发方式是在write()方法中传入密码参数。
修复方案
方案1:修正标准库zipfile写法(仅兼容旧式加密)
修改ZIP文件写入部分的代码,在write时传入密码参数:
with zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED) as zf: # 直接在write方法中传入pwd参数,触发加密 zf.write(file_path, arcname=file_name, pwd=password.encode('utf-8'))
注意:该方式生成的ZIP仍使用旧式加密,部分工具可能无法识别密码,仅适合兼容性要求低的场景。
方案2:使用第三方库实现强加密(推荐)
使用支持AES加密的pyzipper库(zipfile的增强版),步骤如下:
- 安装依赖:
pip install pyzipper
- 修改代码:
import pyzipper # ... 保留原有MongoDB查询、CSV生成逻辑 ... password = "1234" zip_file_path = directory / (file_name + ".zip") # 使用AES加密创建ZIP文件 with pyzipper.AESZipFile(zip_file_path, 'w', compression=pyzipper.ZIP_DEFLATED, encryption=pyzipper.WZ_AES) as zf: zf.setpassword(password.encode('utf-8')) zf.write(file_path, arcname=file_name)
该方式生成的ZIP采用AES加密,兼容性强,主流解压工具均支持密码验证。
额外优化建议
- 避免将文件写入根目录
/,建议使用临时目录(如tempfile.TemporaryDirectory()),防止文件冲突或权限问题。 - 返回ZIP文件后,记得删除临时生成的CSV文件,避免占用磁盘空间。
内容的提问来源于stack exchange,提问作者putta
相关产品推荐
相关产品推荐

