Boto3 получить последний префикс / подпапку - PullRequest
0 голосов
/ 23 апреля 2019

Я хотел бы получить последний префикс S3, основанный на времени последнего изменения или времени создания.Не уверен, что есть элегантный способ сделать это.Что я получаю до сих пор:

s3 = boto3.client("s3")
response = s3.list_objects_v2(Bucket="bucket_name", Delimiter="/", Prefix="abc/")['CommonPrefixes']

for obj in response:
   print obj['Prefix']

"bucket_name/abc/20190420"
"bucket_name/abc/20190421"
"bucket_name/abc/20190422"
"bucket_name/abc/20190423"

Допустим, каждый день мы создаем префикс и ключи в папке, каков наилучший способ получить последний префикс, который называется «bucket_name / abc / 20190423» вэтот случай, если сегодня 2019-04-23?Кроме того, не думайте, что префикс name всегда является числом или датой, которую мы легко анализируем и сортируем, это могут быть также случайные буквы или слова.

Являются ли префиксы из ответа естественным образом упорядоченными на основе некоторого измененного времени или созданиявремя?Если нет, то какой самый элегантный способ получить самый последний префикс?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Я предполагаю, что под «последним префиксом» вы подразумеваете «префикс объекта, который был создан последним».

Обратите внимание, что префиксы на самом деле не создаются . Скорее, они просто являются частью Key (имя файла) объекта.

Получить последний созданный объект относительно просто. Вы можете использовать интерфейс командной строки AWS:

aws s3api list-objects --bucket my-bucket --query 'sort_by(Contents, &LastModified)[-1].Key' --output text

Затем вы можете манипулировать выводом с помощью сценариев оболочки (поднимитесь до последней косой черты).

В Python вы можете использовать:

import boto3

s3_client = boto3.client('s3', region_name='ap-southeast-2')

response = s3_client.list_objects_v2(Bucket='my-bucket')

# Get the key of the object with the highest LastModified date
latest_object = max(response['Contents'], key = lambda obj: obj['LastModified'])['Key']

# Print prefix of latest object
if '/' in latest_object:
    print(latest_object[:latest_object.rfind('/')]  )
0 голосов
/ 23 апреля 2019

Не уверен в том, как работает boto3, но вы могли бы сделать простое сравнение, используя функции split и max.

def getDateValue(prefixString):
    return int(prefixString.split("/")[2])

s3 = boto3.client("s3")
response = s3.list_objects_v2(Bucket="bucket_name", Delimiter="/", Prefix="abc/")['CommonPrefixes']

latest = max(response, key=getDateValue)

Функция getDateValue принимает префикс, разделяет его на основесимвол "/", получает третью часть (дату) и преобразует ее в целое число.Функция max применяет это к каждому префиксу и возвращает значение с наибольшим значением (т. Е. Самой поздней датой)

...