我正在使用 Lambda 使用 boto3、Zipfile(作为 zf)和 BytesIO 解压缩 S3 中的文件。触发该函数时,将运行以下代码(此时我已经初始化了 s3 客户端。我使用此示例作为代码的基础。bucketname和zip_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 缓冲区时我是否遗漏了某些操作?任何帮助表示赞赏