Как получить дату последнего изменения последнего файла из S3 с Boto Python? - PullRequest
0 голосов
/ 21 февраля 2020

Это структура моего хранилища 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

Я пытаюсь go в Ведро 1 >> перейти к компании A FOLDER и найти последнюю версию файла A и распечатать дату изменения, Я хотел повторить те же шаги для Файла B, а затем для Папки / Файла Компании B. Я новичок в 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 и напечатать, если! = сегодня то же самое с файлом B

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Почти там, однако оператор if сравнивает 2 разных объекта datetime, которые содержат дату и время - время будет отличаться. Если вы только после даты, то измените if на:

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

Работает на Python 3.6.9.

1 голос
/ 22 февраля 2020

Предполагая, что у «файла 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

...