J'écris des scripts python pour télécharger des fichiers vers s3 en utilisant boto. Je veux uniquement télécharger des fichiers modifiés que je peux vérifier par leur dernière date et heure de modification. Mais je ne trouve pas l'api de obtenir la dernière modification dans l'API boto.
Voici un extrait de code Python/boto qui affichera l'attribut last_modified de toutes les clés d'un compartiment:
>>> 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
>>>
cela fonctionne (tnx à jdennison d'en haut):
après avoir obtenu la clé de 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))
Boto3 renvoie un objet datetime pour LastModified
lorsque vous utilisez l'objet (S3) Object
python:
Vous ne devriez pas avoir besoin d'effectuer de manipulations de cordes tortueuses.
Pour comparer LastModified
à la date d'aujourd'hui (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"])
Vous devez simplement savoir que LastModifed
est sensible au fuseau horaire, donc toute date que vous comparez avec elle doit également être sensible au fuseau horaire, d'où:
datetime.now(timezone.utc)
Si vous utilisez Django et Django-storages , vous pouvez une API non officielle dans le s3boto backend:
>>> 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)
Malheureusement, à partir de Django-storages 1.1.5, cela donne un datetime naïf. Vous devez utiliser Django.utils.timezone
pour créer une version consciente:
>>> 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>)
Convertissez l'attribut last_modified en struct_time comme indiqué ci-dessous
import time
for key in bucket.get_all_keys():
time.strptime(key.last_modified[:19], "%Y-%m-%dT%H:%M:%S")
Cela donnera un time.struct_time (tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst) Tuple pour chaque clé du compartiment S3
C'est pour les récents list_objectsv2 s3. Le client boto3 donne lastModifed au format datetime.datetime, et les moyens de le convertir sont comme ci-dessous
liens: lien boto
et 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)