web-dev-qa-db-fra.com

Comment puis-je obtenir la dernière date de modification des objets S3 avec boto?

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.

22
vreal

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
>>>
31
garnaat

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))
7
Eyal Ch

Boto3 renvoie un objet datetime pour LastModified lorsque vous utilisez l'objet (S3) Object python:

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

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)

5
Garreth McDaid

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>) 
4
bradley.ayers

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

3
Syed

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) 
0
ravi.zombie