Boto3获取最新的前缀/子文件夹

问题描述 投票:0回答:2

我想根据上次修改时间或创建时间获取最新的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"

让我们说每天我们在文件夹下创建一个前缀和密钥,在这种情况下,假设今天是2019-04-23,获取最新前缀“bucket_name / abc / 20190423”的最佳方法是什么?此外,不要假设前缀名称始终是我们容易解析和排序的数字或日期,它也可以是随机字母或单词。

响应的前缀是根据一些修改的时间或创建时间进行本地排序的吗?如果没有,获得最新前缀的最优雅方式是什么?

python amazon-web-services amazon-s3 boto3 boto
2个回答
1
投票

我将假设“最新前缀”是指“最近创建的对象上的前缀”。

请注意,实际上并没有创建前缀。相反,它们只是对象的Key(文件名)的一部分。

获取最近创建的对象相对简单。您可以使用AWS CLI:

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

然后,您可以通过shell脚本操作输出(直到最后一个斜杠)。

在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
投票

不确定boto3是如何工作的,但你可以使用splitmax函数进行简单的比较。

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函数将其应用于每个前缀并返回具有最高值的那个(即最新日期)

© www.soinside.com 2019 - 2024. All rights reserved.