Python s3无效的存档文件
Posted
技术标签:
【中文标题】Python s3无效的存档文件【英文标题】:Python s3 invalid archive file 【发布时间】:2021-11-30 17:33:38 【问题描述】:我正在尝试使用下面的代码在 s3 上压缩文件,问题是,文件似乎已创建,但是当我尝试打开 zip 文件时,它显示存档无效的错误。 知道我在这里做错了什么......
我使用的代码如下...
def upload_zip_file(event,context):
try:
bucket_name ="s3_bucket"
bucket_path ="files"
s3 = boto3.client('s3')
data_io = BytesIO()
filename = "FILE.zip"
funct_name ="FILE.json"
zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zipper:
infile_object = s3.get_object(Bucket=bucket_name, Key=bucket_path +"/"+ funct_name)
infile_content = infile_object['Body'].read()
zipper.writestr(filename, infile_content)
s3.put_object(Bucket=bucket_name, Key=bucket_path +"/"+filename, Body=zip_buffer.getvalue())
except Exception:
print(traceback.format_exc())
【问题讨论】:
通过阅读您发布的代码,我推断处理正在 aws lambda 函数中完成,对吗? 是的,没错 你能从给定的 s3 存储桶下载文件吗? 是的,fly 是在 s3 上创建的,我可以下载它... 当你说“当我尝试打开 zip 文件时”时,我对你的意思感到困惑,从分配给funct_name
的字符串文字来看,看起来代码读取了一个 json 文件,不一定是 zip 文件,即代码 写入 到 zip 文件。这是代码的正确意图吗?
【参考方案1】:
您需要将 put_object 移到 with 之外,以便正确关闭文件句柄。
zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zipper:
infile_object = s3.get_object(Bucket=bucket_name, Key=filename)
infile_content = infile_object['Body'].read()
zipper.writestr(filename, infile_content)
s3.put_object(Bucket=bucket_name, Key='test.zip', Body=zip_buffer.getvalue())
【讨论】:
感谢您的回复.....它是一个 JSON 文件,并且添加 infile_content = infile_object['Body'].read().decode('utf-8') 似乎不起作用 read() 返回字节。您需要对其进行解码以将其用作字符串 (***.com/questions/31976273/…)。我的印象是 writestr 需要一个字符串而不是字节对象。 @Faisal Niazi 您是否收到相同的错误消息或其他信息? @LucasRoberts 也是无效存档的错误 你需要关闭文件然后上传,看我编辑的答案。以上是关于Python s3无效的存档文件的主要内容,如果未能解决你的问题,请参考以下文章
将 zip 文件 obj 上传到 S3 - KeyError:存档中没有名为 8388608 的项目
ruby 用于从RDS下载日志文件并存档到S3的Ruby脚本。
ruby 用于从RDS下载日志文件并存档到S3的Ruby脚本。