Вернуть все ключи из корзины Amazon S3, которые были изменены за последние 24 часа - PullRequest
0 голосов
/ 02 октября 2018

Вот ситуация: я работаю удаленно, и в большинстве случаев люди добавляют наборы данных в наш экземпляр Amazon S3.Каждый из этих наборов данных требует очень похожих задач обработки, которые я могу автоматизировать с помощью довольно простого Python.Тем не менее, я не могу выделить наборы данных, которые были добавлены в S3 за последние 24 часа, используя дату изменения.Вот что у меня есть:

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 голосов
/ 03 октября 2018

Вау!Спасибо за совет @Matt Messersmith.Я использую Python 2 (черт побери, установка 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
0 голосов
/ 02 октября 2018

Попробуйте этот фрагмент (просто получите все элементы и затем отфильтруйте):

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...