You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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的增强版),步骤如下:

  1. 安装依赖:
pip install pyzipper
  1. 修改代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:14:52