Как составить список путей S3 Bucket Delimiter - PullRequest
0 голосов
/ 05 октября 2018

Как вывести список путей разделителя сегментов S3?

В основном я хочу перечислить все "каталоги" и / или "подкаталоги" в сегменте s3.Я знаю, что они физически не существуют.В основном я хочу, чтобы все объекты, которые содержат разделитель, а затем возвращали только ключевой путь ранее для разделителя.Начинать с префикса было бы еще лучше, но на уровне корзины должно быть достаточно.

Пример S3 Bucket:

root.json
/2018/cats/fluffy.png
/2018/cats/gary.png
/2018/dogs/rover.png
/2018/dogs/jax.png

Я хотел бы затем сделать что-то вроде:

s3_client = boto3.client('s3')
s3_client.list_objects(only_show_delimiter_paths=True)

Результат

/2018/
/2018/cats/
/2018/dogs/

Я не вижу способа сделать это изначально, используя: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.list_objects

Я мог бы получить все имена объектов и сделать это в своем коде приложенияно это кажется неэффективным.

1 Ответ

0 голосов
/ 06 октября 2018

Страница Amazon S3 в boto3 имеет этот пример :

Список общих префиксов верхнего уровня в корзине Amazon S3

В этом примере показано, как перечислить все общие префиксы верхнего уровня в корзине Amazon S3:

import boto3

client = boto3.client('s3')
paginator = client.get_paginator('list_objects')
result = paginator.paginate(Bucket='my-bucket', Delimiter='/')
for prefix in result.search('CommonPrefixes'):
    print(prefix.get('Prefix'))

Но он показывает только префиксы верхнего уровня.

Итак,Вот код для печати всех «папок»:

import boto3

client = boto3.client('s3')
objects = client.list_objects_v2(Bucket='my-bucket')

keys = [o['Key'] for o in objects['Contents']]

folders = {k[:k.rfind('/')+1] for k in keys if k.rfind('/') != -1}

print ('\n'.join(folders))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...