【问题标题】:Boto3 get latest prefix/sub folderBoto3 获取最新的前缀/子文件夹
【发布时间】:2019-04-23 06:06:10
【问题描述】:

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

响应中的前缀是根据修改时间或创建时间本地排序的吗?如果不是,那么获取最新前缀的最优雅方法是什么?

【问题讨论】:

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


    【解决方案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('/')]  )
    

    【讨论】:

    • 谢谢,了解 s3 路径没有文件夹概念,对象是基于实际密钥级别的密钥。感谢您的帮助。
    【解决方案2】:

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

    【讨论】:

    • 如果前缀名称没有模式,它是每天创建的随机字母而不是日期时间怎么办?我更新了这个问题,提到了这种可能性。
    • 这种情况下是行不通的。它仅适用于示例中的文本,其中前缀的最后部分可以转换为整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2023-02-22
    • 2020-07-26
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多