Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 气流:使用通配符从S3下载最新文件_Python_Python 3.x_Boto3_Airflow - Fatal编程技术网

Python 气流:使用通配符从S3下载最新文件

Python 气流:使用通配符从S3下载最新文件,python,python-3.x,boto3,airflow,Python,Python 3.x,Boto3,Airflow,要求:从s3下载最新文件,即当前文件 s3中的示例文件 bucketname/2020/09/reporting_2020_09_20200902000335.zip bucketname/2020/09/reporting_2020_09_20200901000027.zip 当我通过s3_src_键作为/2020/09/reporting_2020_09_20200902时,在以下一种情况下不起作用 代码: 低于一的工作很好 import os bucket = 'bucketname'

要求:从s3下载最新文件,即当前文件

s3中的示例文件

bucketname/2020/09/reporting_2020_09_20200902000335.zip
bucketname/2020/09/reporting_2020_09_20200901000027.zip
当我通过s3_src_键作为
/2020/09/reporting_2020_09_20200902
时,在以下一种情况下不起作用

代码:

低于一的工作很好

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中使用通配符的帮助。您可以列出与给定模式匹配的对象,但随后需要编写代码来确定其中哪一个是最新的


这是您需要的

我想您应该迭代存储桶中的对象,按从文件名中提取的日期对它们进行排序,然后选择第一个。如何定义“最新文件”?您是基于
LastModified
日期,该日期指示对象存储在Amazon S3中的时间,还是基于对文件名的解释?如果您使用的是文件名,那么在给定文件夹名称和文件名(键)的情况下,查找“最新文件”的规则是什么?它是否总是说
报告
?此外,为什么年+月会列出3次(
2020/09
2020\u 09
202009
)?如果他们彼此不同意怎么办?这就是供应商发送文件的方式:)。。是的,我得到了报告文件,基于文件名示例,这里的
报告文件
是今天的文件。我也可以使用LastModifiedDate,但我认为带有文件名的前缀更容易
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)