如何在Python中按日期范围获取并遍历S3存储桶数据
按日期范围获取S3存储桶文件的解决方案
你可以利用S3对象键的字典序特性(与YYYY/MM/DD格式的日期时间序一致),结合list_objects_v2的分页查询能力实现需求。以下是修改后的代码及关键说明:
修改后的代码
import boto3 from datetime import datetime # 初始化S3客户端(替换为你的密钥和存储桶名) s3 = boto3.client('s3', aws_access_key_id='你的访问密钥', aws_secret_access_key='你的秘密密钥') bucket_name = '你的存储桶名称' # 定义起始日期(格式必须与文件键的日期前缀完全匹配) start_date_str = '2022/10/01' # 获取今日日期并格式化为相同结构 today_str = datetime.today().strftime('%Y/%m/%d') # 构造终止边界:确保所有今日及之前的键都小于该值 end_boundary = today_str + 'z' # 存储所有符合条件的对象 matching_objects = [] # 分页查询S3对象,处理大量文件的情况 continuation_token = None while True: query_params = { 'Bucket': bucket_name, 'StartAfter': start_date_str } if continuation_token: query_params['ContinuationToken'] = continuation_token response = s3.list_objects_v2(**query_params) # 筛选出符合日期范围的对象 if 'Contents' in response: for obj in response['Contents']: obj_key = obj['Key'] if obj_key <= end_boundary: matching_objects.append(obj) else: # 因S3按字典序返回,后续对象都会超出范围,直接终止遍历 break # 检查是否还有更多结果需要获取 if response.get('IsTruncated'): continuation_token = response['NextContinuationToken'] else: break # 输出所有匹配的文件键 for item in matching_objects: print(item['Key'])
关键说明
- 使用
list_objects_v2:相比旧版list_objects,它支持更高效的分页(通过续传令牌),且单次查询最多返回1000个对象,适合处理大量文件的场景。 StartAfter参数:直接跳过起始日期之前的所有对象,减少不必要的查询和筛选。- 终止边界构造:利用字典序规则,
today_str + 'z'会比所有今日的文件键都大(例如2024/05/20/file.txt<2024/05/20z),确保只包含今日及之前的文件。 - 提前终止遍历:由于S3返回的对象是按键排序的,一旦遇到第一个超出边界的对象,后续对象都会更大,可直接跳出循环提升效率。
注意事项
- 确保起始日期的格式与文件键的日期前缀完全一致(例如文件键是
2022-10-01/data.csv,则日期字符串需改为2022-10-01)。 - 确认S3客户端拥有
s3:ListBucket权限,否则会出现访问被拒绝的错误。 - 如果文件的日期粒度是月/年(如
2022/10/),可调整起始和终止字符串的格式来匹配。
内容的提问来源于stack exchange,提问作者Lilly s
相关产品推荐
相关产品推荐

