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.

48voto

garnaat Punkte 41136

Hier ein Ausschnitt aus Python/Boto-Code, der das Attribut last_modified aller Schlüssel in einem Bucket ausgibt:

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

31voto

Garreth McDaid Punkte 2183

Boto3 gibt ein Datetime-Objekt für LastModified wenn Sie den (S3) verwenden Object python Objekt:

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

Sie sollten keine umständlichen String-Manipulationen vornehmen müssen.

Zum Vergleich LastModified auf das heutige Datum (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"])

Sie müssen sich nur bewusst sein, dass LastModifed ist zeitzonenkompatibel, so dass jedes Datum, das Sie damit vergleichen, auch zeitzonenkompatibel sein muss, daher:

datetime.now(timezone.utc)

18voto

bonney Punkte 487

Für ein einziges s3-Objekt können Sie die boto client's head_object() Methode, die schneller ist als list_objects_v2() für ein Objekt, da weniger Inhalt zurückgegeben wird. Der zurückgegebene Wert ist datetime ähnlich wie bei allen Boto-Antworten und daher leicht zu verarbeiten.

head_object() Methode verfügt über weitere Funktionen zum Änderungszeitpunkt des Objekts, die ohne weitere Aufrufe nach list_objects() Ergebnis.

Siehe dies: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.head_object

import boto3

s3 = boto3.client('s3')
response = client.head_object(Bucket, Key)
datetime_value = response["LastModified"]

10voto

Eyal Ch Punkte 8554

Das funktioniert (danke an jdennison von oben):

nachdem Sie den Schlüssel von s3 erhalten haben:

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

4voto

Syed Punkte 41

Konvertieren Sie das Attribut last_modified wie folgt in struct_time

import time
for key in bucket.get_all_keys(): 
    time.strptime(key.last_modified[:19], "%Y-%m-%dT%H:%M:%S")

Dies ergibt ein time.struct_time(tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst) Tupel für jeden Schlüssel im S3 Bucket

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