使用boto3获取S3指定路径下符合命名规则的文件键
boto3获取S3指定路径下符合命名规则的文件键
S3的列表接口原生只支持前缀匹配,不支持服务端的后缀、通配符检索,直接按下面的方式实现,性能和准确性都有保证:
- 先利用已知的
transaction_id构造检索前缀f"{transaction_id}/",让S3服务端直接返回该路径下的所有对象,避免扫描全桶浪费请求和时间 - 遍历返回的对象列表,本地筛选出以
_input.json结尾的键即可 - 记得处理分页,单次S3列表请求最多返回1000个对象,用boto3自带的paginator不用手动处理翻页参数。
示例代码如下:
import boto3 s3_client = boto3.client('s3') # 替换为你自己的桶名和已知的transaction_id TARGET_BUCKET = "你的存储桶名称" KNOWN_TRANSACTION_ID = "你的transaction_id值" search_prefix = f"{KNOWN_TRANSACTION_ID}/" result_keys = [] # 初始化分页器 page_iterator = s3_client.get_paginator('list_objects_v2').paginate( Bucket=TARGET_BUCKET, Prefix=search_prefix ) for page in page_iterator: # 目录为空时没有Contents字段,直接跳过 for obj in page.get('Contents', []): current_key = obj['Key'] # 匹配以_input.json结尾的文件 if current_key.endswith('_input.json'): # 如果你需要严格匹配单层路径(即不匹配transaction_id下子文件夹里的同名后缀文件) # 放开下面两行注释即可 # relative_part = current_key.removeprefix(search_prefix) # if '/' not in relative_part: # result_keys.append(current_key) result_keys.append(current_key) # result_keys就是所有符合规则的文件键 print(result_keys)
避坑提示
- 不要不加Prefix直接拉取整个桶的对象列表,桶内文件量大的时候请求耗时和成本都会高很多
- 不要在Prefix参数里写
*、?这类通配符,S3的前缀是严格字符串匹配,不会识别通配符语义 - 如果对应transaction_id路径下文件量级达到十万级以上,可以考虑用S3清单服务做离线检索,常规业务量级下上面的代码完全够用
内容的提问来源于stack exchange,提问作者back-new
相关产品推荐
相关产品推荐

