it-roy-ru.com

Как загрузить последний файл S3 Bucket с помощью Boto3?

Другие вопросы, которые я мог найти, касались более старой версии Boto. Я хотел бы скачать последний файл S3 Bucket. В документации я обнаружил, что существует метод list_object_versions (), который возвращает вам логическое значение IsLatest. К сожалению, мне удалось установить соединение и загрузить файл. Не могли бы вы показать мне, как я могу расширить свой код, чтобы получить последний файл корзины? Спасибо

import boto3
conn = boto3.client('s3',
                    region_name="eu-west-1",
                    endpoint_url="customendpoint",
                    config=Config(signature_version="s3", s3={'addressing_style': 'path'}))

Отсюда я не знаю, как получить последний добавленный файл из корзины с именем mytestbucket. В корзине есть различные CSV-файлы, но все они, конечно, с другим именем.

Обновление:

import boto3
from botocore.client import Config

s3 = boto3.resource('s3', region_name="eu-west-1", endpoint_url="custom endpoint", aws_access_key_id = '1234', aws_secret_access_key = '1234', config=Config(signature_version="s3", s3={'addressing_style': 'path'}))
my_bucket = s3.Bucket('mytestbucket22')
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]

Это дает мне следующую ошибку:

NameError: name 'get_last_modified' is not defined
3
user3080315

Вариант ответа, который я предусмотрел: Boto3 S3, сортировка по последнему измененному . Вы можете изменить код в соответствии с вашими потребностями.

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

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

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

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

Ты можешь сделать

import boto3

s3_client = boto3.client('s3')
response = s3_client.list_objects_v2(Bucket='bucket_name', Prefix='prefix')
all = response['Contents']        
latest = max(all, key=lambda x: x['LastModified'])
2
smaraf

По сути, это тот же ответ, что и helloV, если вы используете Session, как я.

from boto3.session import Session
import settings

session = Session(aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
                          aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY)
s3 = session.resource("s3")

get_last_modified = lambda obj: int(obj.last_modified.strftime('%s'))


bckt = s3.Bucket("my_bucket")
objs = [obj for obj in bckt.objects.all()]

objs = [obj for obj in sorted(objs, key=get_last_modified)]
last_added = objs[-1].key

Сортировка objs позволяет быстро удалить все файлы, кроме последней с

for obj in objs[:-1]:
    s3.Object("my_bucket", obj.key).delete()
1
user32185

Если у вас много файлов, вам нужно использовать нумерацию страниц, как упомянуто helloV. Вот как я это сделал.

get_last_modified = lambda obj: int(obj['LastModified'].strftime('%s'))
s3 = boto3.client('s3')
paginator = s3.get_paginator( "list_objects" )
page_iterator = paginator.paginate( Bucket = "BucketName", Prefix = "Prefix")
for page in page_iterator:
    if "Contents" in page:
        last_added = [obj['Key'] for obj in sorted( page["Contents"], key=get_last_modified)][-1]
0
SaadK