使用文件夹结构

时间:2018-03-26 00:04:57

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

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

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

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

我已经阅读了很多关于使用boto3的帖子,然后迭代,但是如果我需要的话可能会有相互矛盾的细节。

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

我接近了 import 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'])

1 个答案:

答案 0 :(得分:3)

使用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   Objects API,我们建议您使用此修订后的API for new   应用程序开发。

来自this回答:

  

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