【问题标题】:How to download latest n items from AWS S3 bucket using boto3?如何使用 boto3 从 AWS S3 存储桶下载最新的 n 个项目?
【发布时间】:2023-03-29 00:17:01
【问题描述】:

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

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

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

我该怎么做?

【问题讨论】:

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

标签: python amazon-web-services amazon-s3 lambda boto3


【解决方案1】:

如果您的应用程序定期上传文件,您可以试试这个:

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 个文件,这可以解决问题。

【讨论】:

    【解决方案2】:

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

    但是,要使其正常工作,您需要为上传的文件采用某种形式的带日期戳的前缀。例如,2021-04-16/myfile.csv

    如果您觉得您必须检索 N 个文件,那么您可以使用前缀仅检索列表的一部分。假设您知道自己每天上传大约 100 个文件,然后以 2021-04-05/ 开始您的存储桶列表。

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 2018-01-04
      • 2022-01-09
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多