Подтвердить что ты не робот

Список содержимого ведра с boto3

Как я могу видеть, что внутри ведра в S3 с помощью boto3? (т.е. a "ls")?

Выполнение следующих действий:

import boto3
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('some/path/')

возвращает:

s3.Bucket(name='some/path/')

Как я могу увидеть его содержимое?

4b9b3361

Ответ 1

Один из способов просмотра содержимого:

for my_bucket_object in my_bucket.objects.all():
    print(my_bucket_object)

Ответ 2

Это похоже на "ls", но он не учитывает соглашение о папке префикса и перечисляет объекты в ведре. Он оставил читателю отфильтровать префиксы, которые являются частью имени ключа.

В Python 2:

from boto.s3.connection import S3Connection

conn = S3Connection() # assumes boto.cfg setup
bucket = conn.get_bucket('bucket_name')
for obj in bucket.get_all_keys():
    print(obj.key)

В Python 3:

from boto3 import client

conn = client('s3')  # again assumes boto.cfg setup, assume AWS S3
for key in conn.list_objects(Bucket='bucket_name')['Contents']:
    print(key['Key'])

Ответ 3

Я предполагаю, что вы настроили аутентификацию отдельно.

import boto3
s3 = boto3.resource('s3')

my_bucket = s3.Bucket('bucket_name')

for file in my_bucket.objects.all():
    print(file.key)

Ответ 4

Если вы хотите передать ключи ACCESS и SECRET (что делать не следует, потому что это небезопасно):

from boto3.session import Session

ACCESS_KEY='your_access_key'
SECRET_KEY='your_secret_key'

session = Session(aws_access_key_id=ACCESS_KEY,
                  aws_secret_access_key=SECRET_KEY)
s3 = session.resource('s3')
your_bucket = s3.Bucket('your_bucket')

for s3_file in your_bucket.objects.all():
    print(s3_file.key)

Ответ 5

Чтобы обрабатывать большие списки ключей (например, когда список каталогов превышает 1000 элементов), я использовал следующий код для накопления ключевых значений (то есть имен файлов) с несколькими списками (спасибо Амелио выше за первые строки). Код для python3:

    from boto3  import client
    bucket_name = "my_bucket"
    prefix      = "my_key/sub_key/lots_o_files"

    s3_conn   = client('s3')  # type: BaseClient  ## again assumes boto.cfg setup, assume AWS S3
    s3_result =  s3_conn.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter = "/")

    if 'Contents' not in s3_result:
        #print(s3_result)
        return []

    file_list = []
    for key in s3_result['Contents']:
        file_list.append(key['Key'])
    print(f"List count = {len(file_list)}")

    while s3_result['IsTruncated']:
        continuation_key = s3_result['NextContinuationToken']
        s3_result = s3_conn.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter="/", ContinuationToken=continuation_key)
        for key in s3_result['Contents']:
            file_list.append(key['Key'])
        print(f"List count = {len(file_list)}")
    return file_list

Ответ 6

Моя утилита s3 keys по сути является оптимизированной версией ответа @Hephaestus:

import boto3


s3_paginator = boto3.client('s3').get_paginator('list_objects_v2')


def keys(bucket_name, prefix='/', delimiter='/', start_after=''):
    prefix = prefix[1:] if prefix.startswith(delimiter) else prefix
    start_after = (start_after or prefix) if prefix.endswith(delimiter) else start_after
    for page in s3_paginator.paginate(Bucket=bucket_name, Prefix=prefix, StartAfter=start_after):
        for content in page.get('Contents', ()):
            yield content['Key']

В моих тестах (boto3 1.9.84) это значительно быстрее, чем эквивалентный (но более простой) код:

import boto3


def keys(bucket_name, prefix='/', delimiter='/'):
    prefix = prefix[1:] if prefix.startswith(delimiter) else prefix
    bucket = boto3.resource('s3').Bucket(bucket_name)
    return (_.key for _ in bucket.objects.filter(Prefix=prefix))

Поскольку S3 гарантирует результаты сортировки в двоичном формате UTF-8, оптимизация start_after была добавлена к первой функции.

Ответ 7

Более экономным способом, вместо того, чтобы перебирать цикл for, вы также можете просто напечатать исходный объект, содержащий все файлы внутри вашей корзины S3:

session = Session(aws_access_key_id=aws_access_key_id,aws_secret_access_key=aws_secret_access_key)
s3 = session.resource('s3')
bucket = s3.Bucket('bucket_name')

files_in_s3 = bucket.objects.all() 
#you can print this iterable with print(list(files_in_s3))

Ответ 8

ObjectSummary:

Есть два идентификатора, которые прикреплены к ObjectSummary:

  • bucket_name
  • ключ

boto3 S3: ObjectSummary

Подробнее об объектных ключах из документации AWS S3:

Ключи объекта:

Когда вы создаете объект, вы указываете имя ключа, которое однозначно идентифицирует объект в корзине. Например, в консоли Amazon S3 (см. Консоль управления AWS) при выделении сегмента отображается список объектов в нем. Эти имена являются ключами объекта. Имя для ключа представляет собой последовательность символов Unicode, кодировка UTF-8 которых имеет длину не более 1024 байтов.

Модель данных Amazon S3 представляет собой плоскую структуру: вы создаете контейнер, а контейнер хранит объекты. Не существует иерархии вложенных или вложенных папок; однако вы можете вывести логическую иерархию, используя префиксы и разделители имен ключей, как это делает консоль Amazon S3. Консоль Amazon S3 поддерживает концепцию папок. Предположим, что ваше ведро (созданное администратором) имеет четыре объекта со следующими объектными ключами:

Разработка /Projects1.xls

Финансы /statement1.pdf

Частные лица /taxdocument.pdf

s3-dg.pdf

Ссылка:

AWS S3: ключи объекта

Вот пример кода, который демонстрирует, как получить имя корзины и ключ объекта.

Пример:

import boto3
from pprint import pprint

def main():

    def enumerate_s3():
        s3 = boto3.resource('s3')
        for bucket in s3.buckets.all():
             print("Name: {}".format(bucket.name))
             print("Creation Date: {}".format(bucket.creation_date))
             for object in bucket.objects.all():
                 print("Object: {}".format(object))
                 print("Object bucket_name: {}".format(object.bucket_name))
                 print("Object key: {}".format(object.key))

    enumerate_s3()


if __name__ == '__main__':
    main()

Ответ 9

Я просто сделал это так, включая метод аутентификации:

s3_client = boto3.client(
                's3',
                aws_access_key_id='access_key',
                aws_secret_access_key='access_key_secret',
                config=boto3.session.Config(signature_version='s3v4'),
                region_name='region'
            )

response = s3_client.list_objects(Bucket='bucket_name', Prefix=key)
if ('Contents' in response):
    # Object / key exists!
    return True
else:
    # Object / key DOES NOT exist!
    return False

Ответ 10

в случае, если кто-то ищет обновленный ответ - вам, вероятно, следует использовать список v2 сейчас. из Бото 3 документа:

Возвращает некоторые или все (до 1000) объектов в ведре. Вы можете использовать параметры запроса в качестве критерия выбора для возврата подмножества объектов в сегменте. Примечание. ListObjectsV2 - это переработанный API-интерфейс List Objects, и мы рекомендуем использовать этот переработанный API-интерфейс для разработки новых приложений.

client = boto3.client('s3') #auth stuff the same as in the comments above
client.list_objects_v2(
    Bucket="bucket"
    Prefix="prefix" 
)

для получения дополнительной информации о многих файлах в списке сегментов плюс ожидаемый ответ и такая проверка здесь: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.list_objects_v2