Я пишу скрипты python для загрузки файлов на s3 с помощью boto. Я хочу только загрузить измененные файлы, которые я могу проверить с помощью последнего измененного datetime. Но я не могу найти api, чтобы получить последнее изменение в boto API.
Как я могу получить последнее измененное datetime для объектов S3 с помощью boto?
Ответ 1
Вот фрагмент кода Python/boto, который будет печатать атрибут last_modified всех ключей в ведре:
>>> import boto
>>> s3 = boto.connect_s3()
>>> bucket = s3.lookup('mybucket')
>>> for key in bucket:
print key.name, key.size, key.last_modified
index.html 13738 2012-03-13T03:54:07.000Z
markdown.css 5991 2012-03-06T18:32:43.000Z
>>>
Ответ 2
это работает (tnx to jdennison сверху):
после получения ключа из s3:
import time
from time import mktime
from datetime import datetime
modified = time.strptime(key.last_modified, '%a, %d %b %Y %H:%M:%S %Z')
#convert to datetime
dt = datetime.fromtimestamp(mktime(modified))
Ответ 3
Если вы используете Django и django-storages, вы можете неофициальный API в бэкэнд s3boto:
>>> from storages.backends.s3boto import _parse_datestring
>>> _parse_datestring("Fri, 20 Jul 2012 16:57:27 GMT")
datetime.datetime(2012, 7, 21, 2, 57, 27)
К сожалению, из django-хранилищ 1.1.5 это дает наивное datetime. Для создания поддерживаемой версии необходимо использовать django.utils.timezone
:
>>> from django.utils import timezone
>>> naive = _parse_datestring("Fri, 20 Jul 2012 16:57:27 GMT")
>>> timezone.make_aware(naive, timezone.get_current_timezone())
datetime.datetime(2012, 7, 21, 2, 57, 27, tzinfo=<DstTzInfo 'Australia/Brisbane' EST+10:00:00 STD>)
Ответ 4
Boto3 возвращает объект datetime для LastModified
, когда вы используете объект (S3) Object
python:
Вам не нужно выполнять какие-либо извилистые манипуляции со строками.
Для сравнения LastModified
с сегодняшней датой (Python3):
import boto3
from datetime import datetime, timezone
today = datetime.now(timezone.utc)
s3 = boto3.client('s3', region_name='eu-west-1')
objects = s3.list_objects(Bucket='my_bucket')
for o in objects["Contents"]:
if o["LastModified"] == today:
print(o["Key"])
Вам просто нужно знать, что LastModifed
осведомлен о часовом поясе, поэтому любая дата, которую вы сравниваете с ним, также должна быть осведомлена о часовом поясе, следовательно:
datetime.now(timezone.utc)
Ответ 5
Преобразуйте атрибут last_modified в struct_time, как указано ниже
import time
for key in bucket.get_all_keys():
time.strptime(key.last_modified[:19], "%Y-%m-%dT%H:%M:%S")
Это даст время. truct_time (tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst) для каждого ключа в ведре S3
Ответ 6
Это для недавнего s3 list_objectsv2. Клиент boto3 предоставляет lastModifed в формате datetime.datetime, и способы его преобразования приведены ниже
ссылки: ссылка на boto3
а также
aws s3 listobj
import datetime
from dateutil.tz import tzutc
# node s3 response '2019-06-17T18:42:57.000Z'
# python boto3 s3 response datetime.datetime(2019, 10, 1, 22, 41, 55, tzinfo=tzutc())
''' {'ETag': '"c8ba0ad5003832f63690ea8ff9b66052"',
'Key': 'SOMEFILE',
'LastModified': datetime.datetime(2019, 10, 2, 18, 50, 47, tzinfo=tzutc()),
'Size': 6390623,
'StorageClass': 'STANDARD'}
'''
l = datetime.datetime(2019, 10, 1, 22, 41, 55, tzinfo=tzutc())
get_last_modified = int(l.strftime('%s'))
print(l)
print(get_last_modified)