【问题标题】:Iterate over files in an S3 bucket with folder structure迭代具有文件夹结构的 S3 存储桶中的文件
【发布时间】:2018-09-04 01:20:05
【问题描述】:

我有一个 S3 存储桶。在存储桶中,我们有一个 2018 年的文件夹,以及我们每月和每天收集的一些文件。因此,例如,2018\3\24、2018\3\25 等等。

我们没有将日期放在每天存储桶内的文件中。

基本上,我想遍历存储桶并使用文件夹结构按“日期”对每个文件进行分类,因为我们需要将其加载到不同的数据库中,并且需要一种识别方法。

我已经阅读了大量关于使用 boto3 的帖子,并进行了迭代,但是关于是否可以完成我需要的内容似乎存在冲突的细节。

如果有更简单的方法,请提出建议。

我知道了 导入boto3

s3client = boto3.client('s3')
bucket = 'bucketname'
startAfter = '2018'

s3objects= s3client.list_objects_v2(Bucket=bucket, StartAfter=startAfter )
for object in s3objects['Contents']:
    print(object['Key'])

【问题讨论】:

    标签: python-3.x amazon-s3 amazon-ec2


    【解决方案1】:

    使用 boto3 时,每个请求只能列出 1000 个对象。所以要获取桶中的所有对象,可以使用s3的paginator

    client.get_paginator('list_objects_v2') 是您所需要的。

    你需要这样的东西:

    import boto3
    client = boto3.client('s3')
    paginator = client.get_paginator('list_objects_v2')
    result = paginator.paginate(Bucket='bucketname',StartAfter='2018')
    for page in result:
        if "Contents" in page:
            for key in page[ "Contents" ]:
                keyString = key[ "Key" ]
                print keyString
    

    来自this 文档:

    list_objects:

    返回存储桶中的部分或全部(最多 1000 个)对象。你可以 使用请求参数作为选择标准返回一个子集 桶中的对象。

    list_objects_v2:

    返回存储桶中的部分或全部(最多 1000 个)对象。你可以 使用请求参数作为选择标准返回一个子集 桶中的对象。注意:ListObjectsV2是修改后的List 对象 API,我们建议您将此修订后的 API 用于新的 应用程序开发。

    来自this 回复:

    list_objects_v2 增加了功能。由于每页列出 1000 个键的限制,使用 列出多个页面的标记可能会让人头疼。逻辑上,你需要 跟踪您成功处理的最后一个密钥。和 ContinuationToken,你不需要知道最后一个键,你只需检查 响应中存在NextContinuationToken。你可以产卵 并行处理处理 1000 个键的倍数而不处理 使用最后一个键来获取下一页。

    【讨论】:

    • 感谢您的信息。这是一个帮助。我一直在玩原始的 boto 和 boto 3,我认为我想要结束的基本上是一个以文件名作为键,然后以创建日期作为值的字典。 for key in mybucket.list(): print "{name}\t{created}".format(name = key.name, created = key.creation_date, ) 它抛出了一个我认为的错误是不相关的,但如果我能找到类似那本字典的东西,它应该可以工作。
    • 很高兴知道它有一些帮助。如果达到目的,请“将答案标记为已接受”。
    猜你喜欢
    • 2019-12-31
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2020-12-10
    • 2016-10-02
    • 2015-05-20
    相关资源
    最近更新 更多