#python #python-3.x #boto3 #airflow
#python #python-3.x #boto3 #воздушный поток
Вопрос:
Требование: загрузить последний файл, т. Е. текущий файл с s3
Пример файла в s3
bucketname/2020/09/reporting_2020_09_20200902000335.zip
bucketname/2020/09/reporting_2020_09_20200901000027.zip
Когда я передаю s3_src_key как /2020/09/reporting_2020_09_20200902
не работает для ниже одного
Код:
with tempfile.NamedTemporaryFile('r') as f_source, tempfile.NamedTemporaryFile('w') as f_target:
s3_client.download_file(self.s3_src_bucket, self.s3_src_key, f_source.name)
Приведенный ниже вариант работает нормально
import os
bucket = 'bucketname'
key = '/2020/09/reporting_2020_09_20200902'
s3_resource = boto3.resource('s3')
my_bucket = s3_resource.Bucket(bucket)
objects = my_bucket.objects.filter(Prefix=key)
for obj in objects:
path, filename = os.path.split(obj.key)
my_bucket.download_file(obj.key, filename)
Мне нужна помощь, как использовать подстановочный знак в Airflow
Комментарии:
1. Я предполагаю, что вы бы перебрали объекты в корзине, отсортировали их по дате, извлеченной из имени файла, а затем выбрали бы первый.
2. Как вы определяете «последний файл»? Будете ли вы основывать это на
LastModified
дате, которая указывает, когда объект был сохранен в Amazon S3, или вы основываете это на интерпретации имени файла? Если вы используете имя файла, каково правило для поиска «последнего файла», учитывая имя папки и имя файла (ключ)? Всегда ли он будет говоритьreporting_
? Кроме того, почему год месяц указаны 3 раза (2020/09
,2020_09
и202009
)? Что, если они не согласны друг с другом?3. Вот как поставщик отправляет файлы 🙂 .. Да, я получаю reporting_ files, основываясь на примере имени файла здесь
reporting_2020_09_20200902
— это сегодняшний файл. Я также могу использовать LastModifiedDate, Но я подумал, что префикс с именем файла проще
Ответ №1:
Вы можете перечислить объекты, соответствующие заданному шаблону, но тогда вам нужно будет написать код, который определяет, какой из них является последним.
Вот функция Python SDK, которая вам понадобится