使用 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也可以直接对日期时间进行排序。