【问题标题】:Python s3 invalid archive filePython s3无效的存档文件
【发布时间】: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 文件。这是代码的正确意图吗?

标签: python amazon-s3 zipfile


【解决方案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() 返回字节。您需要对其进行解码以将其用作字符串 (stackoverflow.com/questions/31976273/…)。我的印象是 writestr 需要一个字符串而不是字节对象。
  • @Faisal Niazi 您是否收到相同的错误消息或其他信息?
  • @LucasRoberts 也是无效存档的错误
  • 你需要关闭文件然后上传,看我编辑的答案。
猜你喜欢
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
相关资源
最近更新 更多