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脚本。

将文件从AWS S3复制到Azure存储存档层

SevenZipArchiveException:存档无效。打开/读取错误

Powershell - 展开存档并重命名文件,因为它包含无效字符