使用文件夹结构迭代 S3 存储桶中的文件

Dat*_*Dog 4 amazon-s3 amazon-ec2 python-3.x

我有一个 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'])
Run Code Online (Sandbox Code Playgroud)

Ven*_*agi 5

使用 boto3 时,每个请求只能列出 1000 个对象。所以要获取bucket中的所有对象,可以使用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
Run Code Online (Sandbox Code Playgroud)

这个文档:

列表对象:

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

list_objects_v2:

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

这个答案:

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