Boto3 S3, sorte de seau par dernière modification
J'ai besoin de récupérer une liste d'éléments de S3 en utilisant Boto3, mais au lieu de retourner ordre de tri par défaut (décroissant) je veux qu'il revienne par ordre inverse.
Je sais que vous pouvez le faire via awscli:
aws s3api list-objects --bucket mybucketfoo --query "reverse(sort_by(Contents,&LastModified))"
et sa faisable via l'INTERFACE utilisateur de la console (pas sûr si cela est fait côté client ou côté serveur)
Je ne peux pas l'impression de voir comment faire cela dans Boto3.
Je suis actuellement en train de récupérer tous les fichiers, puis le tri...mais cela semble exagéré, surtout si je ne se soucient les 10 ou si les plus récentes des fichiers.
Le système de filtre semble être la seule à accepter le Préfixe pour les s3, rien d'autre.
Le S3 api n'a pas l'appui de l'inscription de cette façon. La CLI (et probablement la console) va chercher tout et ensuite effectuer le tri.
Vous obtenez les données en Python, donc il suffit de trier les données renvoyées. Il n'y a pas besoin de demander boto3 de le faire pour vous, c'est juste une ligne supplémentaire de Python.
le problème est la complexité. pourquoi obtenir des enregistrements N, puis trier des enregistrements N pour obtenir la série Z que vous voulez, quand vous pouvez demander à AWS afin de retourner uniquement Z régler d'abord? même raison, je ne veux pas faire
select * from table
. et puis la boucle à travers et trouver "où X = 1".Vous pouvez utiliser
subprocess
module pour exécuter l'aws cli api qui prend en charge le tri par date.OriginalL'auteur nate | 2017-06-15
Vous devez vous connecter pour publier un commentaire.
Si il n'y a pas beaucoup d'objets dans le seau, vous pouvez utiliser Python pour faire le tri de vos besoins.
Définir un lambda pour obtenir l'heure de dernière modification:
Obtenir tous les objets et de les trier par date de dernière modification.
Si vous voulez inverser le tri:
get_last_modified = lambda obj: int(obj.last_modified.strftime('%s'))
files = [obj.key for obj in sorted(unsorted, key=get_last_modified, reverse=True)][0:9]
list_objects_v2 retourne 1000 objets max, si votre seau contient plus de 1000 ci-dessus ne fonctionne pas
c'est pourquoi j'ai mis l'avertissement
If there are not many objects in the bucket
Est-ce qu'il faut pour lancer le "LastModified" à la chaîne et ensuite? Cela semble fonctionner ainsi:
get_last_modified = lambda obj: obj['LastModified']
mais est-il une raison pour le format de la date en tant que chaîne de caractères en premier lieu? En comparant datetime objets directement semble fonctionner.
OriginalL'auteur helloV
J'ai fait une petite variation de ce que @helloV posté ci-dessous. ses pas 100% de l'optimum, mais il fait le travail avec les limites boto3 a compter de ce moment.
OriginalL'auteur nate
il semble que n'est pas une façon de faire le tri en utilisant boto3. Selon la documentation, boto3 prend uniquement en charge de ces méthodes pour les Collections:
all(), filter(**kwargs), page_size(**kwargs), limit(**kwargs)
Espère que cette aide, en quelque sorte.
https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.ServiceResource.buckets
OriginalL'auteur Juan Diego Garcia
cela vous donnera toutes les clés dans un ordre trié
OriginalL'auteur Israelsofer