0

我正在使用 Lambda 使用 boto3、Zipfile(作为 zf)和 BytesIO 解压缩 S3 中的文件。触发该函数时,将运行以下代码(此时我已经初始化了 s3 客户端。我使用此示例作为代码的基础。bucketnamezip_key值找到没有问题。s3_uri也已正确生成。 :

    bucketname = event["Records"][0]['s3']['bucket']['name']
    zip_key = event["Records"][0]['s3']['object']['key']
    s3_uri = 's3://'+bucketname+'/'
    
    #get zip folder from S3
    zip_obj = s3_client.Object(bucket_name=bucketname, key=zip_key)

    #create IO buffer
    buffer = BytesIO(zip_obj.get()["Body"].read())
    
   
    z = zf.ZipFile(buffer)

    for filename in z.namelist():
        file_info = z.getinfo(filename)
        
        #Ignore folders generated by Mac zip operation
        if "__MACOSX" in str(file_info):
            print("")
        else:
            s3_client.meta.client.upload_fileobj(z.open(filename),Bucket=bucketname,Key=f'output/{filename}')

运行代码时,创建 IO 缓冲区时出现以下错误:

NoSuchKey: An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.
Traceback (most recent call last):
  File "/var/task/app.py", line 22, in lambda_handler
    buffer = BytesIO(zip_obj.get()["Body"].read())

zip 文件有一个主文件夹,有 4 个子文件夹,每个子文件夹中都有需要读取和处理的 Excel 文件。我注意到这适用于其中包含单个 excel 文件的 zip 文件,但它不适用于其中包含文件的多个文件夹。创建 IO 缓冲区时我是否遗漏了某些操作?任何帮助表示赞赏

4

1 回答 1

0

问题不在 zip 文件中,问题在s3_client.Object没有 keyBody的 . 可能,URI 不正确?

于 2021-11-07T20:38:06.813 回答