使用 boto3 列出 S3 中带有后缀的对象

fac*_*ev7 4 python boto3

def get_latest_file_movement(**kwargs):
    get_last_modified = lambda obj: int(obj['LastModified'].strftime('%s'))
    s3 = boto3.client('s3')
    objs = s3.list_objects_v2(Bucket='my-bucket',Prefix='prefix')['Contents']
    last_added = [obj['Key'] for obj in sorted(objs, key=get_last_modified, reverse=True)][0]
    return last_added
Run Code Online (Sandbox Code Playgroud)

上面的代码为我提供了最新的文件,但我只想要以“csv”结尾的文件

hc_*_*dev 5

按后缀过滤

如果 S3 对象的键是 filename 则对象的后缀是文件扩展名(例如.csv)。

因此,通过以 结尾的键过滤对象.csv

使用filter(predicate, iterable)带有谓词的操作作为 的 lambda 测试str.endswith(suffix)

s3 = boto3.client('s3')
objs = s3.list_objects_v2(Bucket='my-bucket',Prefix='prefix')['Contents']

csvs = filter(lambda obj: obj['Key'].endswith('.csv'), objs)  # csv only 
csvs.sort(key=lambda obj: obj['LastModified'], reverse=True)  # last first, sort by modified-timestamp descending

return csvs[0]
Run Code Online (Sandbox Code Playgroud)

注意:仅获取最后修改的

此解决方案使用(降序)交替排序方向reverse=True来选择最后修改的第一个。您还可以sort默认(升序)并选择最后一个,[-1]Kache 在前面的问题中回答的那样

简化

来自boto3list_objects_v2关于响应结构的文档:

Contents (list) ... LastModified (datetime) -- 对象的创建日期。

Boto3 返回 的日期时间对象LastModified。另请参阅使用 boto 获取 S3 对象的上次修改日期时间

那么为什么我们需要额外的步骤将其格式化为字符串,然后转换为 int: int(obj['LastModified'].strftime('%s'))

Python 还可以直接对日期时间进行排序。

限制警告

S3的API操作及其相应的Boto3方法list_objects_v2将结果集限制为1000个对象:

每次请求都会返回存储桶中的部分或全部(最多 1,000 个)对象。

因此,对于具有许多同名对象的存储桶,即使在应用前缀过滤器之后,您的结果也可能会被隐式截断。