如何将带密码保护的内存Zip文件上传至S3存储桶?
问题原因
Python标准库的zipfile.setpassword()方法不是用来加密压缩文件的——它仅作用于解压操作,用来验证读取压缩文件时的密码。标准库zipfile本身不支持在压缩过程中加密文件,这就是你设置密码后无效的核心原因。
解决方法:使用pyzipper库
pyzipper是zipfile的第三方扩展分支,支持AES加密(比传统ZipCrypto更安全),可以实现带密码的压缩操作。
步骤1:安装pyzipper
pip install pyzipper
步骤2:修改代码实现加密压缩
替换原代码中的zipfile为pyzipper,并指定加密类型,修改后的完整代码如下:
import csv import pyzipper import io import boto3 # S3连接配置 s3 = boto3.resource('s3', endpoint_url='', aws_access_key_id='', aws_secret_access_key='') # 将DataFrame写入CSV缓冲区 buffer_string_csv = io.StringIO() df.to_csv(buffer_string_csv) # 转成bytes避免编码问题 csv_content = buffer_string_csv.getvalue().encode('utf-8') # 创建带AES加密的ZIP缓冲区 buffer_zip = io.BytesIO() with pyzipper.ZipFile(buffer_zip, 'w', compression=pyzipper.ZIP_DEFLATED, encryption=pyzipper.WZ_AES) as zip_file: zip_file.setpassword(b'123') zip_file.writestr('foobar.csv', csv_content) # 上传到S3 buffer_zip.seek(0) # 重置缓冲区指针到起始位置 s3.Bucket('QAS').put_object(Body=buffer_zip.getvalue(), Key='foobar.zip')
关键说明
- 使用
with语句自动管理ZipFile的生命周期,无需手动调用close(),更安全可靠 - 指定
encryption=pyzipper.WZ_AES启用AES加密,这是目前最安全的ZIP加密方式 - 将CSV内容转为bytes格式,避免跨编码场景下的乱码问题
- 上传前调用
buffer_zip.seek(0)确保从缓冲区起始位置读取内容(部分场景下可能需要,养成好习惯)
内容的提问来源于stack exchange,提问作者Triloki Gupta
相关产品推荐
相关产品推荐

