Получение только имен файлов из корзины S3 без загрузки файлов - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть корзина с 4+ миллионами файлов (50GB +). Я хотел бы получить список файлов (без данных), используя Python без загрузки файлов.

files = s3_bucket.objects.filter(Prefix='myPrefix')

# print(len(list(files_raw)))
for key in files:
    print(key.last_modified)

У меня есть что-то подобное, но я замечаю, что через сеть поступает много данных.

Я пытался просмотреть документацию для ObjectSummary и надеялся, что она загружает только метаданные. ObjectSummary и Операция HEAD

Операция HEAD извлекает метаданные из объекта, не возвращая сам объект. Эта операция полезна, если вас интересуют только метаданные объекта. Чтобы использовать HEAD, вы должны иметь доступ READ к объекту.

Запрос HEAD имеет те же параметры, что и операция GET для объекта. Ответ идентичен ответу GET, за исключением того, что тело ответа отсутствует.

Нужно ли загружать весь файл только для получения имен файлов?

1 Ответ

1 голос
/ 04 февраля 2020

При использовании метода resource в boto3 запросы фактически транслируются в другие вызовы API. Однако непросто увидеть, какие звонки происходят "за кадром". Иногда один метод может переводиться в несколько вызовов (например, ListObjects и HeadObject).

Вы можете рассмотреть возможность использования метода вызовов client , поскольку они отображают 1: 1 в API звонки на AWS:

import boto3

s3_client = boto3.client('s3')

paginator = s3_client.get_paginator('list_objects_v2')

response_iterator = paginator.paginate(Bucket='bucket-name')

for page in response_iterator:
    for object in page['Contents']:
        print(object['Key'], object['LastModified'])

Я бы также рекомендовал вам посмотреть Amazon S3 Inventory . Он может предоставить ежедневный CSV-файл, содержащий список всех объектов и их метаданных. Это очень полезно для больших ведер (таких как ваше).

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