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”结尾的文件
如果 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 个)对象。
因此,对于具有许多同名对象的存储桶,即使在应用前缀过滤器之后,您的结果也可能会被隐式截断。
| 归档时间: |
|
| 查看次数: |
10037 次 |
| 最近记录: |