2017-01-11 1 views
0

Пытается захватить файлы дельты (файлы, созданные после последней обработки), сидя на s3. Для этого с помощью boto3 filter iterator по запросу LastModified значение, а не возвращающее весь список файлов и фильтрацию на клиентском сайте.AWS boto3 page_iterator.search не может сравнивать datetime.datetime с str

Согласно 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 

Образец paginator reponse;

{ 
"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

После потратить несколько минут на 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) 
+0

JMESPATH поддерживает datetime.datetime; Пожалуйста, возьмите ответ в моем первоначальном вопросе и используйте его на jmespath; Содержание [? LastModified> = 'datetime.datetime (2016, 12, 27, 8, 5, 37, tzinfo = tzutc())']. Ключ – East2West

+0

@ East2West Синтаксис ответа - это JSON, и это не объект datetime , но строка datetime. Вот почему он показывает ошибку: 'не может сравнивать datetime.datetime с str' – mootmoot

+0

filter_iterator = page_iterator.search ( " Содержание [? LastModified> = '"+ str (datetime.datetime (2016, 12, 27, 8, 5, 37)) + "']. Ключ") возвращает ту же ошибку .... – East2West

0

реализация Boto3 Jmespath не поддерживает дату фильтрации (он будет помечать их как несовместимые тип «Юникод» и «DateTime» в вашем примере). Но, кстати, Dates анализируется Amazon, вы можете выполнить их лексическое сравнение с помощью метода to_string() Jmespath.

Что-то вроде этого:

"Contents[?to_string(LastModified)>='\"2015-01-01 01:01:01+00:00\"']" 

Но имейте в виду, что сво lexographical сравнение и не датирует сравнение. Работает большую часть времени.