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.
Antworten
Zu viele Anzeigen?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
>>>
Boto3 gibt ein Datetime-Objekt für LastModified
wenn Sie den (S3) verwenden Object
python Objekt:
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)
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"]
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))
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
- See previous answers
- Weitere Antworten anzeigen