Boto3 S3, сортировочный ковш по последнему измененному

Мне нужно получить список элементов из S3 с помощью Boto3, но вместо того, чтобы возвращать порядок сортировки по умолчанию (по убыванию), я хочу, чтобы он возвращал его в обратном порядке.

Я знаю, что вы можете сделать это через awscli:

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

и его выполнимость через консоль пользовательского интерфейса (не уверен, что это делается на стороне клиента или на стороне сервера)

Кажется, я не вижу, как это сделать в Boto3.

В настоящее время я извлекаю все файлы, а затем сортирую … но это кажется излишним, особенно если я беспокоюсь только о 10 или около того самых последних файлах.

Кажется, что система фильтров принимает только префикс для s3, больше ничего.

Я могу понять ваш случай использования. Вы можете сделать это легко через команду aws s3.

Например: aws s3 ls testing1-goreplay –recursive

Дайте мне знать, если это сработает для вас.

Если в ведре не так много объектов, вы можете использовать Python для сортировки в соответствии с вашими потребностями.

Определите лямбда, чтобы получить последнее измененное время:

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

Получите все объекты и отсортируйте их по последнему измененному времени.

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

Если вы хотите изменить сортировку:

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

кажется, что это не способ сделать вид, используя boto3. Согласно документации, boto3 поддерживает только эти методы для коллекций:

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

Надеюсь, что это поможет. https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.ServiceResource.buckets

Я сделал небольшую вариацию того, что @helloV опубликовал ниже. его не на 100% оптимальный, но он выполняет свою работу с ограничениями boto3 с этого времени.

 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]