Boto3 S3分页器无法返回过滤结果的问题求助
解决S3分页器filtered_iterator无输出的问题
问题核心:boto3返回的Contents列表中,LastModified字段是Python datetime对象(带UTC时区),而非字符串。你用的JmesPath表达式是基于字符串比较,自然匹配不到任何结果——这也是为什么AWS CLI和JmesPath网站测试有效的原因:CLI返回的是JSON格式的日期字符串,和你测试的场景一致,但boto3直接返回原生Python对象。
解决方案1:Python层面过滤(推荐)
直接在遍历分页结果时,用datetime对象做比较,简单可靠:
from datetime import datetime, timezone client = boto3.client('s3', region_name='us-west-2') paginator = client.get_paginator('list_objects_v2') operation_parameters = {'Bucket': self.bucket_name, 'Prefix': file_path_prefix} page_iterator = paginator.paginate(**operation_parameters) # 目标日期需转为带UTC时区的datetime(S3的LastModified是UTC时间) cutoff_date = datetime(2022, 10, 31, tzinfo=timezone.utc) for page in page_iterator: # 注意处理无Contents的分页(比如最后一页) if 'Contents' not in page: continue for item in page['Contents']: if item['LastModified'] >= cutoff_date: print('page2', item)
解决方案2:转换为JSON后用JmesPath过滤
如果坚持要用JmesPath,可以先将分页响应序列化为JSON(把datetime转成字符串),再进行搜索:
import json from datetime import datetime, timezone client = boto3.client('s3', region_name='us-west-2') paginator = client.get_paginator('list_objects_v2') operation_parameters = {'Bucket': self.bucket_name, 'Prefix': file_path_prefix} page_iterator = paginator.paginate(**operation_parameters) for page in page_iterator: # 将page转为JSON字符串,datetime会被序列化为ISO格式 page_json = json.loads(json.dumps(page, default=str)) # 用你的JmesPath逻辑筛选 filtered_items = page_json.get('Contents', []) filtered_items = [item for item in filtered_items if item['LastModified'] >= '2022-10-31T00:00:00'] for item in filtered_items: print('page2', item)
注意:方案2需要额外的序列化步骤,性能略低于方案1,一般优先选方案1。
内容的提问来源于stack exchange,提问作者Logan Waite
相关产品推荐
相关产品推荐

