Как я могу получить последний измененный datetime объектов S3 с помощью boto? - PullRequest
19 голосов
/ 13 марта 2012

Я пишу скрипты на python для загрузки файлов на s3 с помощью boto. Я хочу загружать только измененные файлы, которые я могу проверить по дате последнего изменения. Но я не могу найти API для последней модификации в API boto.

Ответы [ 5 ]

30 голосов
/ 13 марта 2012

Вот фрагмент кода 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
>>>
7 голосов
/ 03 апреля 2014

это работает (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))
4 голосов
/ 04 октября 2012

Если вы используете Django и django-хранилища , вы можете неофициальный 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 это дает наивную дату и время.Вам нужно использовать 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>) 
2 голосов
/ 08 марта 2019

Boto3 возвращает объект datetime для LastModified, когда вы используете объект (S3) Object python:

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.last_modified

Вам не нужновыполнять любые извилистые манипуляции со строками.

Чтобы сравнить 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)

2 голосов
/ 07 мая 2013

Преобразовать атрибут 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")

Это даст кортеж time.struct_time (tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst) для каждого ключа в сегменте S3

...