Список папок в S3 Bucket до определенной глубины - PullRequest
0 голосов
/ 01 апреля 2020

Я хотел бы получить список из s3 различных папок до глубины 5

, например, если у меня есть объекты ниже в корзине s3

inbound/publisher/segment/db/tb1/yyyy/mm/dd/hhmmss/file1
inbound/publisher/segment/db/tb1/yyyy/mm/dd/hhmmss/file2
inbound/publisher/segment/db/tb1/yyyy/mm/dd/hhmmss/file3
inbound/publisher/segment/db/tb2/yyyy/mm/dd/hhmmss/file1
inbound/publisher/segment/db/tb2/yyyy/mm/dd/hhmmss/file2
inbound/publisher/segment/db2/tb1/yyyy/mm/dd/hhmmss/file11
inbound/publisher/segment/db2/tb2/yyyy/mm/dd/hhmmss/file31

вывод должен быть таким:

inbound/publisher/segment/db/tb1
inbound/publisher/segment/db/tb2
inbound/publisher/segment/db2/tb1
inbound/publisher/segment/db2/tb2

Я использовал библиотеку boto3 в приведенном ниже коде и попытался получить результат, используя paginator.

, но paginator выдает полный список, может помочь кто-то получить ожидаемый результат, как указано выше .

вот мой код.

import boto3

S3 = boto3.client('s3', 'eu-west-1')
PAGINATOR = S3.get_paginator('list_objects_v2')

def lambda_handler(event, context):

  bucket_name = "sample_bucket"
  prefix_key = "inbound/publisher/"

  pages = PAGINATOR.paginate(
      Bucket=bucket_name,
      Prefix=prefix_key
  )
  obj_list = []
  for page in pages:
    if 'Contents' in page:
      for obj in page['Contents']:
        obj_list.append({'Key': obj['Key']})
      print(obj_list)
    else:
      print('No Contents Found')

, но приведенный выше код возвращает весь список объектов, я пытался использовать Delimiter = '/' при передаче аргумента для разбивки на страницы, но затем он переходит к другому блокировать и печатать содержимое не найдено.

С уважением, Махи

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

У меня работает следующий код:)

import boto3

S3 = boto3.client('s3', 'eu-west-1')
PAGINATOR = S3.get_paginator('list_objects_v2')

def lambda_handler(event, context):
    bucket_name = "sample_bucket"
    prefix_key = "inbound/publisher/"

    pages = PAGINATOR.paginate(
        Bucket=bucket_name,
        Prefix=prefix_key
    )

    obj_list = []

    # Extracting the List untill depth of our choice here till 5th level
    for page in pages:
        if 'Contents' in page:
            for obj in page['Contents']:
                obj['Key'] = '/'.join(obj['Key'].split('/')[0:-6])
                obj_list.append(obj['Key'])
        else:
            print('No Contents Found')

    ##Removing Duplicate values by converting object in list to dict and then again back to list##

    obj_list = list(dict.fromkeys(obj_list))
    print(obj_list)
0 голосов
/ 02 апреля 2020

Махи, попробуй это ...

bucket_name='new-bucket-affe3d3c'   
prefix='inbound/publisher/segment/'
delimiter='/'

paginator= s3_client.get_paginator('list_objects_v2')
for response_iterator in paginator.paginate(
   Bucket=bucket_name,
   Prefix=prefix,
   Delimiter=delimiter
):
#pprint(response_iterator)

#folders -> CommonPrefixes
if 'CommonPrefixes' in response_iterator:
    for obj in response_iterator['CommonPrefixes']:
        print(obj)

#files -> Contents
if 'Contents' in response_iterator:
    for obj in response_iterator['Contents']:
        print(obj)

output:
{'Prefix': 'inbound/publisher/segment/db/'}
{'Prefix': 'inbound/publisher/segment/db2/'}

Поскольку в сегменте db и db2 различны ...
Надеюсь, это поможет ...
r0ck

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