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

时间:2019-04-22 21:16:37

标签: python amazon-web-services amazon-s3 boto3 boto

我想根据上次修改时间或创建时间获取最新的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”的最佳方法是什么?另外,不要假设前缀名称总是我们容易解析和排序的数字或日期,它也可以是随机字母或单词。

响应的前缀是否基于某些修改时间或创建时间以本地方式排序?如果没有,获取最新前缀的最优雅方法是什么?

2 个答案:

答案 0 :(得分:1)

我将假定“最新前缀”的意思是“最近创建的对象的前缀”。

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

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

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('/')]  )

答案 1 :(得分:0)

不确定boto3的工作方式,但是您可以使用doc1 = nlp(dict1.items()) doc2 = nlp(dict2.keys()) similarity = dic1.similarity(dic2) 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函数将其应用于每个前缀,并返回具有最大值(即最新日期)的那个前缀