使用 boto3 列出带有后缀的 S3 中的对象
Listing objects in S3 with suffix using 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
上面的代码让我得到了最新的文件,但是我只想要以 'csv'
结尾的文件
您可以检查它们是否以 .csv
:
结尾
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) if obj['Key'].endswith('.csv')][0]
return last_added
按后缀过滤
如果 S3 对象的键是 文件名,则对象的 后缀 是 filename-extension(如 .csv
).
因此按以 .csv
结尾的键过滤对象。
使用filter(predicate, iterable)
operation with predicate as lambda testing for 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]
注:只得到last-modified
此解决方案使用 reverse=True
(降序)来选择第一个将是最后修改的排序方向。
您还可以 sort
默认值(升序)并选择最后一个 [-1]
作为 answered by Kache in your preceding question.
简化
来自 boto3 list_objects_v2
关于响应结构的文档:
Contents (list)
...
LastModified (datetime) -- Creation date of the object.
Boto3 returns datetime 对象 LastModified
。另见 Getting S3 objects' last modified datetimes with boto.
那么为什么我们需要额外的步骤将其格式化为字符串然后转换为 int:int(obj['LastModified'].strftime('%s'))
?
Python也可以直接对日期时间进行排序。
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
上面的代码让我得到了最新的文件,但是我只想要以 'csv'
结尾的文件您可以检查它们是否以 .csv
:
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) if obj['Key'].endswith('.csv')][0]
return last_added
按后缀过滤
如果 S3 对象的键是 文件名,则对象的 后缀 是 filename-extension(如 .csv
).
因此按以 .csv
结尾的键过滤对象。
使用filter(predicate, iterable)
operation with predicate as lambda testing for 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]
注:只得到last-modified
此解决方案使用 reverse=True
(降序)来选择第一个将是最后修改的排序方向。
您还可以 sort
默认值(升序)并选择最后一个 [-1]
作为 answered by Kache in your preceding question.
简化
来自 boto3 list_objects_v2
关于响应结构的文档:
Contents (list) ... LastModified (datetime) -- Creation date of the object.
Boto3 returns datetime 对象 LastModified
。另见 Getting S3 objects' last modified datetimes with boto.
那么为什么我们需要额外的步骤将其格式化为字符串然后转换为 int:int(obj['LastModified'].strftime('%s'))
?
Python也可以直接对日期时间进行排序。