You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:45:59