尝试捕获坐在s3上的增量文件(上次处理后创建的文件)。要通过查询LastModified值使用boto3过滤器迭代器,而不是返回所有文件列表并在客户端站点上进行过滤。
根据http://jmespath.org/ ?,以下查询有效并过滤以下json respose;
filtered_iterator = page_iterator.search(
"Contents[?LastModified>='datetime.datetime(2016, 12, 27, 8, 5, 37, tzinfo=tzutc())'].Key")
for key_data in filtered_iterator:
print(key_data)
然而它失败了;
RuntimeError: xxxxxxx has failed: can't compare datetime.datetime to str
示例分页器响应;
{
"Contents": [{
"LastModified": "datetime.datetime(2016, 12, 28, 8, 5, 31, tzinfo=tzutc())",
"ETag": "1022dad2540da33c35aba123476a4622",
"StorageClass": "STANDARD",
"Key": "blah1/blah11/abc.json",
"Owner": {
"DisplayName": "App-AWS",
"ID": "bfc77ae78cf43fd1b19f24f99998cb86d6fd8220dbfce0ce6a98776253646656"
},
"Size": 623
}, {
"LastModified": "datetime.datetime(2016, 12, 28, 8, 5, 37, tzinfo=tzutc())",
"ETag": "1022dad2540da33c35abacd376a44444",
"StorageClass": "STANDARD",
"Key": "blah2/blah22/xyz.json",
"Owner": {
"DisplayName": "App-AWS",
"ID": "bfc77ae78cf43fd1b19f24f99998cb86d6fd8220dbfce0ce6a81234e632c5a8c"
},
"Size": 702
}
]
}
答案 0 :(得分:2)
在boto3 paginator文档上花了几分钟后,我只是现实主义它实际上是一个语法问题,我把它作为一个字符串忽略了。
实际上,右边包含比较值的引用是backquote
/ backtick,符号 [`] 。您不能对比较值/对象使用单引号 ['] 。
在检查JMESPath示例后,我注意到它正在使用反引用来获得比较值。所以boto3 paginator的实现确实符合JMESPath标准。
这是我使用反引号无错误运行的代码。
import boto3
s3 = boto3.client("s3")
s3_paginator = s3.get_paginator('list_objects')
s3_iterator = s3_paginator.paginate(Bucket='mytestbucket')
filtered_iterator = s3_iterator.search(
"Contents[?LastModified >= `datetime.datetime(2016, 12, 27, 8, 5, 37, tzinfo=tzutc())`].Key"
)
for key_data in filtered_iterator:
print(key_data)
答案 1 :(得分:2)
Boto3 Jmespath实现不支持日期过滤(它会在示例中将它们标记为不兼容类型“unicode”和“datetime”)。但是按照亚马逊解析日期的方式,您可以使用Jmespath的to_string()方法对它们进行词法比较。
这样的事情:
"Contents[?to_string(LastModified)>='\"2015-01-01 01:01:01+00:00\"']"
但请记住,它是一个词法比较,而不是日期比较。大部分时间都在工作。