web-dev-qa-db-fra.com

Boto3 S3, trier le seau par dernière modification

J'ai besoin de récupérer une liste d'articles de S3 en utilisant Boto3, mais au lieu de retourner l'ordre de tri par défaut (décroissant), je veux qu'il le retourne via l'ordre inverse.

Je sais que vous pouvez le faire via awscli:

aws s3api list-objects --bucket mybucketfoo --query "reverse(sort_by(Contents,&LastModified))"

et c'est faisable via la console UI (je ne sais pas si cela se fait côté client ou côté serveur)

Je n'arrive pas à voir comment faire cela dans Boto3.

Je récupère actuellement tous les fichiers, puis je trie ... mais cela semble exagéré, surtout si je ne me soucie que des 10 fichiers les plus récents.

Le système de filtrage semble accepter uniquement le préfixe pour s3, rien d'autre.

12
nate

J'ai fait une petite variation de ce que @helloV a posté ci-dessous. ce n'est pas optimal à 100%, mais il fait le travail avec les limites que boto3 a à ce moment-là.

s3 = boto3.resource('s3')
my_bucket = s3.Bucket('myBucket')
unsorted = []
for file in my_bucket.objects.filter():
   unsorted.append(file)

files = [obj.key for obj in sorted(unsorted, key=get_last_modified, 
    reverse=True)][0:9]
6
nate

S'il n'y a pas beaucoup d'objets dans le compartiment, vous pouvez utiliser Python pour le trier selon vos besoins.

Définissez un lambda pour obtenir la dernière heure modifiée:

get_last_modified = lambda obj: int(obj['LastModified'].strftime('%s'))

Obtenez tous les objets et triez-les par heure de dernière modification.

s3 = boto3.client('s3')
objs = s3.list_objects_v2(Bucket='my_bucket')['Contents']
[obj['Key'] for obj in sorted(objs, key=get_last_modified)]

Si vous souhaitez inverser le tri:

[obj['Key'] for obj in sorted(objs, key=get_last_modified, reverse=True)]
13
helloV

il semble que ce ne soit pas possible de faire le tri en utilisant boto3. Selon la documentation, boto3 prend uniquement en charge ces méthodes pour les collections:

all(), filter(**kwargs), page_size(**kwargs), limit(**kwargs)

J'espère que cette aide d'une certaine manière. https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.ServiceResource.buckets

2
Juan Diego Garcia
keys = []

kwargs = {'Bucket': 'my_bucket'}
while True:
    resp = s3.list_objects_v2(**kwargs)
    for obj in resp['Contents']:
        keys.append(obj['Key'])

    try:
        kwargs['ContinuationToken'] = resp['NextContinuationToken']
    except KeyError:
        break

cela vous donnera toutes les clés dans un ordre trié

0
Israelsofer

s3 = boto3.client('s3')

get_last_modified = lambda obj: int(obj['LastModified'].strftime('%Y%m%d%H%M%S'))

def sortFindLatest(bucket_name):
    resp = s3.list_objects(Bucket=bucket_name)
    if 'Contents' in resp:
        objs = resp['Contents']
        files = sorted(objs, key=get_last_modified)
        for key in files:
            file = key['Key']
            cx = s3.get_object(Bucket=bucket_name, Key=file)

Cela fonctionne pour moi de trier par date et heure. J'utilise Python3 AWS lambda. Votre kilométrage peut varier. Il peut être optimisé, je l'ai volontairement rendu discret. Comme mentionné dans un article précédent, 'reverse = True' peut être ajouté pour changer l'ordre de tri.

0
Nelson