我想根据上次修改时间或创建时间获取最新的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”的最佳方法是什么?另外,不要假设前缀名称总是我们容易解析和排序的数字或日期,它也可以是随机字母或单词。
响应的前缀是否基于某些修改时间或创建时间以本地方式排序?如果没有,获取最新前缀的最优雅方法是什么?
答案 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
函数将其应用于每个前缀,并返回具有最大值(即最新日期)的那个前缀