如何使用密码压缩类似文件的对象,然后在Python中将其上传到s3?

问题描述

我想将数据帧导出到.csv文件,将其压缩,为其设置密码,然后将其上传到公共s3存储桶。

由于我正在编写无服务器脚本,因此I / O有点棘手,但是我能够编写以下代码

 <input type="date" id="start" name="trip-start"
       value="2018-07-22"
       min="2018-01-01" max="2018-12-31">

但是,我无法为.zip文件设置密码。我尝试使用pyminizip库,但无法正常工作。

import gzip
import io
import boto3

gz_buffer = io.BytesIO()
report_bucket_public = "s3_bucket"
report_key_public = "s3_key"
df_report = pd.DataFrame(...)      # the data to upload

with gzip.GzipFile(mode='w',fileobj=gz_buffer) as gz_file:
    df_report.to_csv(io.TextIOWrapper(gz_file,'utf8'),index=False)

s3_client = boto3.resource('s3')
s3_obj = s3_client.Object(report_bucket_public,report_key_public)
s3_obj.put(Body=gz_buffer.getvalue())
s3_client.ObjectAcl(report_bucket_public,report_key_public).put(ACL='public-read')
csv_stream =  io.BytesIO()
df_report.to_csv(io.TextIOWrapper(csv_stream,index=False)

zip_stream =  io.BytesIO()
secret_password = "password"
compression_level = 5 

pyminizip.compress(
    csv_stream,None,zip_stream,secret_password,compression_level
)

有人可以帮忙吗?

解决方法

我通过使用tempfile.TemporaryDirectory()并将未压缩和压缩的数据都写入临时目录中的文件来完成此任务。参见this answer的相关问题。