【问题标题】:How to get last modified date of latest file from S3 with Boto Python?如何使用 Boto Python 从 S3 获取最新文件的最后修改日期?
【发布时间】:2020-03-12 22:27:50
【问题描述】:

这是我的 s3 存储桶的结构

Bucket 1
    Company A
       File A-02/01/20
       File A-01/01/20
       File B-02/01/20
       File B-01/01/20

    Company B
       File A-02/01/20
       File A-01/01/20

我正在尝试转到 Bucket 1 >> 导航到公司 A 文件夹并找到文件 A 的最新版本并打印修改日期,我想对文件 B 和公司 B 文件夹/文件重复相同的步骤A. 我是 S3 和 Boto3 的新手,所以还在学习。到目前为止,这就是我的代码

import boto3
from datetime import datetime, timezone

today = datetime.now(timezone.utc)

s3 = boto3.client('s3', region_name='us-east-1')

objects = s3.list_objects(Bucket='Bucket 1',Prefix = 'Company A'+'/File')

for o in objects["Contents"]:
    if o["LastModified"] != today:
        print(o["Key"] +" "+ str(o["LastModified"]))

这会打印出以下内容:

File A_2019-10-28.csv 2019-11-11 18:31:17+00:00 
File A_2020-01-14.csv 2020-01-14 21:17:46+00:00 
File A_2020-01-28.csv 2020-01-29 19:19:58+00:00

但我只想检查文件 A_2020-01-28.csv 并打印 if !=today,与文件 B 相同

【问题讨论】:

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


    【解决方案1】:

    假设“文件 A”的末尾总是有一个日期,您可以在前缀搜索中使用“A”部分。对于 S3,要记住的一件事是没有 文件夹 这样的东西。这就是您在键名中使用“/”所暗示的意思。 S3 仅适用于 Buckets/Keys。

    该文件的最新 版本将是具有最新last_modified 字段的版本。一种方法是根据该属性对对象列表(“A”文件)进行排序:

    from operator import attrgetter
    
    objs = s3.Bucket('Bucket 1').objects.filter(Prefix='Company A/File A')
    
    # sort the objects based on 'obj.last_modified'
    sorted_objs = sorted(objs, key=attrgetter('last_modified'))
    
    # The latest version of the file (the last one in the list)
    latest = sorted_objs.pop()
    

    举个例子:我依次创建了 foo1.txt、foo2.txt、foo3.txt。然后是 foo10.txt、foo5.txt。 foo5.txt 是我最新的“foo”文件。

    >>> b.upload_file('/var/tmp/foo.txt','foo10.txt')
    >>> b.upload_file('/var/tmp/foo.txt','foo5.txt')
    >>> [i.key for i in b.objects.all()]  ## no ordering
    ['foo.txt', 'foo10.txt', 'foo2.txt', 'foo3.txt', 'foo5.txt']
    >>> f2 = sorted(b.objects.all(), key=attrgetter('last_modified'))
    >>> f2
    [s3.ObjectSummary(bucket_name='foobar', key='foo.txt'), s3.ObjectSummary(bucket_name='foobar', key='foo2.txt'), s3.ObjectSummary(bucket_name='foobar', key='foo3.txt'), s3.ObjectSummary(bucket_name='foobar', key='foo10.txt'), s3.ObjectSummary(bucket_name='foobar', key='foo5.txt')]
    >>> f2.pop()
    s3.ObjectSummary(bucket_name='foobar', key='foo5.txt')
    

    有关 Python 排序的更多详细信息,请参阅:https://wiki.python.org/moin/HowTo/Sorting

    【讨论】:

      【解决方案2】:

      差不多了,但是if 语句比较了两个不同的datetime 对象,它们包含日期和时间——时间会有所不同。如果您只是在日期之后,请将if 更改为:

          if o["LastModified"].date() != today.date():
      

      适用于 Python 3.6.9。

      【讨论】:

        猜你喜欢
        • 2012-03-29
        • 2019-02-26
        • 2018-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        相关资源
        最近更新 更多