如何通过Python Lambda获取S3桶文件名并输出为数组格式?
问题描述
在S3桶中上传了多个文件,想通过Python Lambda获取所有文件名,输出成['S1','S2','S3']这样的数组格式。试了下面的代码,但现在输出是每个文件名单独一行,虽然试过用列表append方法,却没得到预期结果。
尝试的代码
import boto3 import json from datetime import datetime as dt client = boto3.resource('s3') s3_client = boto3.client('s3') def lambda_handler(event, context): paginator = s3_client.get_paginator('list_objects') # Create a PageIterator from the Paginator page_iterator = paginator.paginate(Bucket='mylocals3bucketpoc') for page in page_iterator: vars = [] for Contents in page['Contents']: print(Contents['Key'])
当前输出
S1 S2 S3
期望输出
['S1','S2','S3']
解决方案
你的代码里有两个核心问题:
- 列表
vars定义在了for page in page_iterator循环内部,每次循环都会重新创建空列表,根本存不住所有文件名。 - 只是逐个打印文件名,没把它们添加到列表里,最后也没输出整个列表。
修正后的代码如下:
import boto3 def lambda_handler(event, context): s3_client = boto3.client('s3') # 把列表初始化放在循环外面,确保能累积所有文件名 file_names = [] # 推荐用list_objects_v2,是S3 API的新版本,更高效 paginator = s3_client.get_paginator('list_objects_v2') page_iterator = paginator.paginate(Bucket='mylocals3bucketpoc') for page in page_iterator: # 加个判断,避免桶为空时抛出KeyError if 'Contents' in page: for obj in page['Contents']: file_names.append(obj['Key']) # 打印出你要的数组格式 print(file_names) # 如果需要把结果返回给Lambda的调用方,可以return file_names return file_names
关键说明
- 列表初始化移到循环外部,保证所有分页的文件名都能被收集到同一个列表里。
- 替换成
list_objects_v2,相比旧版的list_objects,性能更好,还支持更多功能。 - 增加
'Contents' in page的判断,防止桶里没有文件时触发报错。 - 最后打印整个列表,输出格式就是你想要的
['S1','S2','S3']。
内容的提问来源于stack exchange,提问作者Utso Das
相关产品推荐
相关产品推荐

