Получение ключей внутри бакета S3 на уровне subfolder: Python

С использованием библиотеки boto3 в Python мы извлечем все ключи корзины s3 на уровне подпапки. В статье описывается получение ключей внутри бакета S3 на уровне subfolder с помощью Python. В этом заметке я покажу вам, как использовать библиотеку Python boto3 для доступа к содержимому бакета на Amazon S3, включая все подпапки внутри корзины.

Amazon S3 — это популярный облачный сервис хранения, предлагаемый Amazon Web Services (AWS). Он позволяет пользователям хранить и извлекать данные из различных приложений через интернет. Это делает его идеальным выбором для хранения и организации больших объемов данных. Если вы работаете с S3 и Python, библиотека boto3 будет отличным выбором.

Пример: 1

Как получить все ключи внутри корзины, если количество объектов ≤ 1000?

import boto3

client = boto3.client('s3')
response = client.list_objects_v2(Bucket='mybucket')
for content in response.get('Contents', []):
    print(content['Key'])
Python

Это не вернет все ключи, если количество объектов ≥ 1000. Если количество объектов ≥ 1000, переходим к примеру 2.

Пример: 2

Как получить все ключи внутри корзины, если количество объектов ≥ 1000?

Используя boto3.resource

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for obj in bucket.objects.all():
    print(obj.key)
Python

Используя boto3.client

def get_all_s3_keys(bucket):
    """Get a list of all keys in an S3 bucket."""
    
    s3 = boto3.client('s3')
    kwargs = {'Bucket': bucket}
    while True:
        resp = s3.list_objects_v2(**kwargs)
        for content in resp.get('Contents', []):
            print(content['Key'])
        try:
            kwargs['ContinuationToken'] = resp['NextContinuationToken']
        except KeyError:
            break
# Here kwargs is simple dictionary that is used to pass parameters 
# to any function
Python

Из приведенных выше примеров видим, что использование boto3.resource более простое при работе с количеством объектов ≥ 1000. Поэтому я буду использовать boto3.resource в последующих примерах.

Пример: 3

Как получить все ключи внутри subfolder бакета?

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
prefix="subfolder1/sub_subfolder1/....."
for object_summary in bucket.objects.filter(Prefix=prefix):
    print(object_summary.key)
Python

Пример: 4

Как получить все ключи внутри subfolder бакета, которые заканчиваются специальным расширением?

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for object_summary in bucket.objects.filter(Prefix="subfolder1/sub_subfolder1"):
    key = object_summary.key
    if key.endswith(".csv"):
        print(key)
Python

Все примеры для получение ключей внутри бакета S3 на уровне subfolder:

import boto3


def get_matching_s3_objects(bucket, prefix="", suffix=""):
    """
    Generate objects in an S3 bucket.
    :param bucket: Name of the S3 bucket.
    :type bucket: str
    :param prefix: Only fetch objects whose key starts with this prefix (optional).
    :type prefix: tuple, list, str
    :param suffix: Only fetch objects whose keys end with this suffix (optional).
    :type suffix: str
    :return: None
    :rtype:
    """

    if isinstance(prefix, str):
        prefixes = (prefix, )
    else:
        prefixes = prefix

    s3 = boto3.resource('s3')
    my_bucket = s3.Bucket(bucket)

    for key_prefix in prefixes:
        for object_summary in my_bucket.objects.filter(Prefix=key_prefix):
            key = object_summary.key
            if key.endswith(suffix):
                print(key)


if __name__ == '__main__':
    # Example 1
    get_matching_s3_objects("bucket_name")
    # Example 2
    get_matching_s3_objects("bucket_name", "subfolder1")
    # Example 3
    get_matching_s3_objects("bucket_name", "subfolder1/sub_subfolder2")
    # Example 4
    get_matching_s3_objects("bucket_name", ["subfolder1", "subfolder2"])
    # Example 5
    get_matching_s3_objects("bucket_name", ("subfolder1", "subfolder2"))
    # Example 5
    get_matching_s3_objects("bucket_name", ("subfolder1", "subfolder2/sub_subfolder1"), ".csv")
    # Example 5
    get_matching_s3_objects("bucket_name", ["subfolder1/sub_subfolder1", "subfolder2/sub_subfolder1"], ".parquet")
Python

Разница между boto3 client и resource

boto3 Client:

  • Это оригинальное абстрактное API boto3
  • Обеспечивает доступ к службам AWS на низком уровне
  • Все операции служб AWS поддерживаются клиентами
  • Предоставляет доступ к botocore клиенту разработчику Обычно соответствует 1:1 с API службы AWS

boto3 Resource:

  • Это более новое абстрактное API boto3
  • Предоставляет API высокого уровня, ориентированное на объекты
  • Не обеспечивает 100% покрытия API служб AWS

Примечание: Если вы копируете код отсюда, обратите внимание на ошибки, которые могут возникнуть из-за отступов. Если у вас возникнут другие ошибки, пожалуйста, прокомментируйте.


Опубликовано

в

,

от

Комментарии

Добавить комментарий