53 Stimmen

Abrufen der letzten Änderungszeitpunkte von S3-Objekten mit boto

Ich schreibe ein Python-Skript, das Dateien hochlädt auf S3 mit boto librairy. Ich möchte nur hochladen geändert Dateien (die ich anhand ihres "zuletzt geänderten" Datums überprüfen kann), aber ich kann den Boto-API-Endpunkt nicht finden, um das Datum der letzten Änderung zu erhalten.

3voto

bradley.ayers Punkte 35163

Wenn Sie Folgendes verwenden Django y django-storages können Sie eine inoffizielle API im 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)

Leider ergibt dies ab django-storages 1.1.5 eine naive Datumsangabe. Sie müssen verwenden django.utils.timezone zur Erstellung einer bewusst Version:

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

2voto

Stefan_EOX Punkte 801

Mit einer Ressource können Sie eine Iterator für alle Objekte und rufen Sie dann die last_modified Attribut einer ObjectSummary .

import boto3

s3 = boto3.resource('s3')
bk = s3.Bucket(bucket_name)

[obj.last_modified for obj in bk.objects.all()][:10]

gibt zurück.

[datetime.datetime(2020, 4, 17, 13, 23, 37, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 37, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 38, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 38, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 38, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 37, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 37, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 20, 20, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 20, 8, 30, 2, tzinfo=tzlocal()),
 datetime.datetime(2020, 3, 26, 15, 33, 58, tzinfo=tzlocal())]

1voto

ravi.zombie Punkte 1414

Der boto3-Client gibt lastModifed im Format datetime.datetime an, und es gibt folgende Möglichkeiten, es zu konvertieren
Links: boto3 Link
und 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)

1voto

veben Punkte 14325

Sie können das Datum der letzten Änderung des Objekts auf diese Weise ermitteln:

とのことです。 resource

boto3.resource('s3').Object(<BUCKET_NAME>, <file_path>).last_modified

とのことです。 client

boto3.client('s3').head_object(<BUCKET_NAME>, <file_path>)['LastModified']

0voto

arjun Punkte 346
import boto3
from boto3.session import Session

session = Session(aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
s3 = session.resource('s3')
my_bucket = s3.Bucket(BUCKET_NAME)

for obj in my_bucket.objects.all():
    print('{} | {}'.format(obj.key, obj.last_modified))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X