Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 如何使用boto3从AWS S3 bucket下载最新的n项?_Python_Amazon Web Services_Amazon S3_Lambda_Boto3 - Fatal编程技术网

Python 如何使用boto3从AWS S3 bucket下载最新的n项?

Python 如何使用boto3从AWS S3 bucket下载最新的n项?,python,amazon-web-services,amazon-s3,lambda,boto3,Python,Amazon Web Services,Amazon S3,Lambda,Boto3,我有一个S3存储桶,我的应用程序将一些最终结果数据帧保存为.csv文件。我想下载这个桶中最新的1000个文件,但我不知道怎么做 我不能手工操作,因为bucket不允许我按日期对文件进行排序,因为它有1000多个元素 我已经看到了一些使用AWS CLI可以解决的问题,但是我没有足够的用户权限来使用AWS CLI,所以我必须使用boto3python脚本来完成,我将把它上传到lambda中 如何才能做到这一点?最好的解决方案是重新定义您的问题:与其检索N个最近的文件,不如检索N个最近几天的所有文件

我有一个S3存储桶,我的应用程序将一些最终结果数据帧保存为.csv文件。我想下载这个桶中最新的1000个文件,但我不知道怎么做

我不能手工操作,因为bucket不允许我按日期对文件进行排序,因为它有1000多个元素

我已经看到了一些使用AWS CLI可以解决的问题,但是我没有足够的用户权限来使用AWS CLI,所以我必须使用
boto3
python脚本来完成,我将把它上传到lambda中


如何才能做到这一点?

最好的解决方案是重新定义您的问题:与其检索N个最近的文件,不如检索N个最近几天的所有文件。我认为在大多数情况下,您会发现这是一个更好的解决方案

然而,为了让它工作,你需要为上传的文件采用某种形式的日期戳前缀。例如,
2021-04-16/myfile.csv


如果您觉得必须检索N个文件,则可以使用前缀仅检索列表的一部分。假设您知道每天上载大约100个文件,然后从
2021-04-05/

开始列出存储桶。如果您的应用程序定期上载文件,您可以尝试以下方法:

import boto3
import datetime

last_n_days = 250
s3 = boto3.client('s3')

paginator = s3.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket='bucket', Prefix='processed')
date_limit = datetime.datetime.now() - datetime.timedelta(30)
for page in pages:
    for obj in page['Contents']:
        if obj['LastModified'] >= date_limit and obj['Key'][-1] != '/':
             s3.download_file('bucket', obj['Key'], obj['Key'].split('/')[-1])

使用上面的脚本,将下载过去250天内修改的所有文件。如果您的应用程序每天上载4个文件,则可以进行修复。

CLI的权限通常与boto3相同。因此,如果不能使用CLI,则很可能无法使用boto3。您能提供更多详细信息吗?为什么您认为可以使用boto3,但不能使用CLI?您只能使用lambda函数?CLI允许您使用JMESPath编写查询,这将允许您根据其他条件过滤结果。但在幕后,它仍在破坏一切。