пытается прочитать все файлы в содержимом s3, отсортированном по времени, используя python - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь получить содержимое всех файлов, отсортированных по времени загрузки файла, у меня есть этот код:

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

, но он возвращает мне только ключи ...

если я делаю:

keys.append(obj)

мне возвращается дикт, но я не могу понять, как получить содержимое файлов в обычном режиме выполнения ... что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Вам нужно будет использовать LastModified для сортировки по времени.Что-то вроде:

import boto3

s3_client = boto3.client('s3', region_name='ap-southeast-2')

all_objects = []
kwargs = {'Bucket': 'my-bucket'}

while True:

    # List objects in bucket
    response = s3_client.list_objects_v2(**kwargs)

    # Create an array of (Modified Date, Key) tuples
    for object in response['Contents']:
        all_objects.append((object['LastModified'], object['Key']))

    try:
        # Next page
        kwargs['ContinuationToken'] = response['NextContinuationToken']
    except KeyError:
        break

# Sort by LastModified
sorted_keys = [object[1] for object in sorted(all_objects)]
print (sorted_keys)
0 голосов
/ 24 февраля 2019

Вы можете использовать boto3 paginator и проходить по каждой странице и получать доступ к объекту Key & LastModified

    s3_client = boto3.client('s3', region_name=REGION)
    pages = s3_client.get_paginator('list_objects_v2')
    page_it = pages.paginate(Bucket=BUCKET)
    files = {}
    for page in page_it:
        for content in page['Contents']
            files[content['Key']] = content['LastModified']

    sorted(files, key=lambda k: k[1])
0 голосов
/ 24 февраля 2019

обычно, когда вы пытаетесь просмотреть все файлы в корзине S3, у вас возникают проблемы с производительностью.Я бы предложил добавить события S3 и сообщить «слушателю» о новых файлах через очередь (SQS).Таким образом, как только вы копируете новый файл, в SQS отправляется новое сообщение (поскольку мы создали событие S3), тогда клиент будет использовать очередь SQS и делать все, что подходит для ожидающих файлов.Это намного быстрее, чем пересекать весь сегмент S3 снова и снова.Вот ссылка для получения дополнительной информации: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

Другим решением будет анализ вашей корзины S3 с помощью Amazon Athena.https://aws.amazon.com/athena/

Я надеюсь, что вы найдете это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...