Python - Aws Boto 3 Поиск подпапок из сегмента / префикса с неизвестной глубиной - PullRequest
1 голос
/ 21 июня 2020

Учитывая, что у меня есть S3 Bucket с несколькими подпапками (с разной глубиной). Можно ли рекурсивно перечислить все объекты и их путь на основе подпапки, которую я ищу?

Например:

  • Bucket: DataLake-App
  • Prefix : App1/2020/06/21/Timestamp/
  • Дополнительный путь к подпапке: ....../table_001/**.csv

.... немного неизвестен и может иметь неизвестную глубину

Учитывая, что я знаю таблица, сегмент и префикс, могу ли я выполнять поиск в подпапках, если он содержит имя таблицы и получает все ее содержимое?

Если да, то как это будет выглядеть в AWS? Последние несколько часов я ломал голову над этим. Любая помощь / идеи были бы замечательными !!

Ответы [ 2 ]

3 голосов
/ 21 июня 2020

Команда list_objects_v2() в boto3 вернет все объекты в корзине.

Указав Prefix, она вернет только объекты по заданному пути.

Если вы wi sh для дальнейших манипуляций, таких как поиск только объектов с ключом, заканчивающимся на /table_001/**.csv, тогда это должно быть сделано в самом Python, например, с помощью endswith() или поиска по регулярному выражению.

Пожалуйста обратите внимание, что list_objects_v2() возвращает только 1000 объектов за раз, поэтому может потребоваться использовать paginator или al oop, используя ContinuationToken, чтобы вернуть все желаемые объекты.

0 голосов
/ 31 июля 2020

Вы можете использовать функцию resource в boto3, для которой не нужно использовать пагинатор.

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my_bucket')

keys = 0

for obj in bucket.objects.all():
    
    keys += 1
    
    if keys > 10000: break
        
print(keys)

# 10001

Используя это,

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('DataLake-App')

for obj in bucket.objects.filter(Prefix='App1/2020/06/21/Timestamp/'):
        
    if obj.key.endswith('.csv') and obj.key.split('/')[-1] == 'table_001':

        print(obj.key)

даст вам результат.

...