返回过去24小时内已修改的Amazon S3存储桶中的所有密钥

时间:2018-10-01 23:56:03

标签: python amazon-s3 boto3

这是情况:我远程工作,大多数时候人们都在向我们的Amazon S3实例添加数据集。这些数据集中的每一个都需要一些非常相似的处理任务,我可以使用一些非常简单的python将其自动化。但是,我似乎无法使用修改后的日期来隔离过去24小时内已添加到S3的数据集。这是我到目前为止的内容:

import boto3 
from boto3.session import Session
ACCESS_KEY = xxxx
SECRET_KEY = xxxx
session = Session(aws_access_key_id=ACCESS_KEY, 
aws_secret_access_key=SECRET_KEY)
s3 = session.resource('s3')
s3_client = boto3.client('s3')
def get_all_s3_keys(bucket):
    keys = []
    kwargs = {'Bucket': bucket}
    while True:
        resp = s3_client.list_objects_v2(**kwargs)
        for obj in resp['Contents']:
            keys.append(obj['Key'])
        try:
            kwargs['ContinuationToken'] = resp['NextContinuationToken']
        except KeyError:
            break
    return keys

bucket_keys = get_all_s3_keys('mybucket')
recnt_keys = [key for key in bucket_keys if 'Temp' in key]

这将返回“ mybucket”中包含单词“ Temp”的所有键,但这显然对修改日期没有帮助。获得最近修改的密钥列表后,我希望能够遍历并将其下载到预定的本地路径。

有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分:1)

尝试以下代码段(只需获取所有项目,然后进行过滤):

import boto3
import datetime

s3 = boto3.resource('s3')
s3_bucket = s3.Bucket('mybucket')
items = [item for item in s3_bucket.objects.filter()] # get them all
now = datetime.datetime.now(datetime.timezone.utc)
td = datetime.timedelta(hours=24)
last_24_hours_keys = [item.key for item in items if now - item.last_modified < td] # filter

HTH。

答案 1 :(得分:1)

哇!感谢您的建议@Matt Messersmith。我正在使用Python 2(Dang Esri python安装-但我需要arcpy)。我将在下面添加针对python 2的细微调整。必须使用pytz而不是datetime.timezone.utc。

s3 = boto3.resource('s3')  s3_bucket = s3.Bucket('bucket') 
items = [item for item in s3_bucket.objects.filter()]  
now = datetime.datetime.now(pytz.utc)  
td = datetime.timedelta(hours=24)  
last_24_hours_keys = [item.key for item in items if now - item.last_modified < td]  
print last_24_hours_keys