Как заставить подключи перебирать и в конечном итоге файлы внутри них в AWS S3 - PullRequest
1 голос
/ 20 июня 2019

У меня есть путь ключа AWS S3 как bucket-name/fo1/fo2/fo3, у которого есть подпути как bucket-name/fo1/fo2/fo3/fo_1, bucket-name/fo1/fo2/fo3/fo_2, bucket-name/fo1/fo2/fo3/fo_3 и так далее.Я хочу перебрать эти ключи fo_1, fo_2, fo_3 etc. по пути bucket-name/fo1/fo2/fo3.

Я попробовал следующее, но это не работает.

s3 = boto3.client('s3')
s3_bucket = 'bucket-name'

prefix = 'fo1/fo2/fo3'
for obj in s3.list_objects_v2(Bucket=s3_bucket, Prefix=prefix, Delimiter='/'):
     # Here when I print obj, it's a string with value as 'MaxKeys'

Любая помощь будет оценена!

ОБНОВЛЕНИЕ:

s3://bucket-name/
        fo1/
           fo2/
              fo3/
                 fo_1/
                     file1
                     ...
                 fo_2/
                     file2
                     ...
                 fo_3/
                     file1
                     ...
                 fo_4/
                     file1
                     ...
                 ...

Этомоя структура, и я хочу получить fo_1, fo_2, fo_3 и файлы внутри нее.Я хочу все внутри объекта fo3 и ничего вне этого.

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Первое, что нужно понять в Amazon S3, это то, что folders do not exist.Скорее, объекты хранятся с полным путем в виде их Key (имя файла).

Например, я могу скопировать файл в корзину, используя Интерфейс командной строки AWS (CLI) :

aws s3 cp foo.txt s3://my-bucket/fo1/fo2/fo3/foo.txt

Это будет работать, даже если папки не существуют.

Чтобы сделать вещи удобными для людей, существует набор «притворных» папок, которые предоставляются через концепцию общий префикс .Таким образом, в консоли управления папки будут отображаться .Однако, если объект был затем удален с помощью:

aws s3 rm s3://my-buket/fo1/fo2/fo3/foo.txt

В результате папки сразу же исчезнут, поскольку их фактически никогда не существовало!

Также для удобства,некоторые команды Amazon S3 позволяют указывать Prefix и Delimiter.Это может использоваться, например, только для перечисления объектов в папке fo3.На самом деле он просто перечисляет объекты, у которых Key начинается с fo1/fo2/fo3/.Когда Key для объекта возвращается, у него всегда будет полный путь к объекту, потому что Key на самом деле - это полный путь.(Не существует понятия имени файла, отдельного от полного Key.)

Итак, если вы хотите получить список всех файлов в fo1 и fo2 и fo3, вы можете сделатьперечисление с Prefix из fo1 и получение всех объектов, которые начинаются с fo1/, но это будет включать объекты в подпапках, поскольку все они имеют префикс fo1/.

Итог: Вместо того, чтобы думать о старомодных каталогах, думайте о Amazon S3 как о плоской структуре хранения.При необходимости вы можете выполнить фильтрацию результатов в своем собственном коде.

0 голосов
/ 20 июня 2019

Вам следует проверить значение, возвращаемое вызовом list_objects_v2(), чтобы понять, какие данные возвращаются.

  • Если указан префикс, он возвращает содержимое предоставленного точного префикса . Любые подкаталоги возвращаются как CommonPrefixes.
  • Если префикс не указан, возвращаются все объекты в корзине. Затем вы можете отфильтровать его самостоятельно в коде, как показано ниже.
import boto3

s3_client = boto3.client('s3', region_name='ap-southeast-2')
s3_bucket = 'my-bucket'
prefix = 'fo1/fo2/fo3/'

response = s3_client.list_objects_v2(Bucket=s3_bucket)
for object in response['Contents']:
    if object['Key'].startswith(prefix):
        print(object['Key'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...