如何修改boto3遍历S3桶代码实现指定前缀下的对象遍历
代码修改方法
你只需要给原函数新增prefix入参,在调用list_objects_v2分页器时传入官方原生的Prefix参数即可,该参数会限定仅返回对象键以指定字符串开头的结果,刚好匹配你要遍历特定前缀路径的需求。
修改后的完整代码
import boto3 def iterate_bucket_items(bucket, prefix=''): """ 生成器,遍历指定S3存储桶下特定前缀的所有对象 :param bucket: S3存储桶名称 :param prefix: 要遍历的对象前缀,默认为空即遍历全桶 :return: 单个对象的元数据字典 """ client = boto3.client('s3') paginator = client.get_paginator('list_objects_v2') # 传入Prefix参数限定返回的对象前缀 page_iterator = paginator.paginate(Bucket=bucket, Prefix=prefix) for page in page_iterator: if page['KeyCount'] > 0: for item in page['Contents']: yield item # 调用示例:遍历s3://test-data-lake/test1/test2/路径下的所有对象 # 注意前缀末尾要加斜杠,避免匹配到test1/test2abc这类非目标路径的对象 for i in iterate_bucket_items(bucket='test-data-lake', prefix='test1/test2/'): # 如果只需要输出JSON文件,可以加判断:if i['Key'].endswith('.json') print(i)
补充说明
- 前缀参数末尾的斜杠不要省略,否则会把
test1/test2_other/、test1/test2file.txt这类前缀匹配的非目标路径内容也查出来 - 如果你只需要该路径下的JSON文件,可以在遍历时加
i['Key'].endswith('.json')的过滤逻辑,筛掉其他后缀的对象
内容的提问来源于stack exchange,提问作者0004
相关产品推荐
相关产品推荐

