Подключение к определенному пути в s3

#python-3.x #amazon-web-services #amazon-s3 #boto3

#python-3.x #amazon-веб-сервисы #amazon-s3 #boto3

Вопрос:

Я пытаюсь подключиться к определенной папке в s3, используя образец python: s3://main_folder/sub_folder1/sub_folder2/

 # want to enter sub_folder2 - s3://main_folder/sub_folder1/sub_folder2/
import boto3

def connect_to_s3():
    s3_cli = boto3.resourse('s3')
    bucket = s3_cli.Bucket('sub_folder2')
    for b in bucket.objects.all():
        print(b.key)
  

Я получаю эту ошибку:

вызвать класс ошибок (parsed_response, operation_name) botocore.errorfactory.NoSuchBucket: произошла ошибка (NoSuchBucket) при вызове операции ListObjects: указанный сегмент не существует

Ответ №1:

Ошибка гласит: The specified bucket does not exist

Это потому, что s3_cli.Bucket('sub_folder2') требуется имя корзины, но вы указали имя папки и не сообщили ему название корзины.

Если вы хотите выполнять операции только над подмножеством корзины, вы можете использовать filter с prefix :

 import boto3

def connect_to_s3():
    s3_cli = boto3.resourse('s3')
    bucket = s3_cli.Bucket('my-bucket')
    for b in bucket.objects.filter(Prefix='sub_folder1/sub_folder2/').all():
        print(b.key)
  

Комментарии:

1. Можете ли вы просто дать мне пример того, как я могу создать вложенную папку 3 в вложенной папке 2 или какой-либо файл в вложенной папке 2?

2. Папки не существуют в Amazon S3. Вместо этого Key объекта содержит полный путь, например folder1/folder2/foo.txt . Таким образом, вы можете создать объект в любой папке, даже если папка не существует! Например, в интерфейсе командной строки AWS (CLI) вы можете использовать aws s3 cp foo.txt s3://my-bucket/folder1/folder2/foo.txt , и он автоматически «создаст» папки. Но если этот объект затем удалить, папки исчезнут. Amazon S3 — это плоская система хранения, которая просто имитирует папки. На самом деле они не существуют. Это просто выглядит так, как они делают.