在具有文件夹结构的S3存储桶中遍历文件。

9 浏览
0 Comments

在具有文件夹结构的S3存储桶中遍历文件。

我有一个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'])

0
0 Comments

问题的出现原因是使用boto3时,每个请求只能列出1000个对象。所以为了获取存储桶中的所有对象,可以使用s3的分页器

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

根据文档

list_objects:

返回存储桶中的一些或所有(最多1000个)对象。您可以使用请求参数作为选择条件来返回存储桶中的一部分对象。

list_objects_v2:

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

根据这个答案:

list_objects_v2添加了一些功能。由于每页限制1000个键,使用标记来列出多个页面可能会很麻烦。从逻辑上讲,您需要跟踪成功处理的最后一个键。使用ContinuationToken,您不需要知道最后一个键,只需检查响应中NextContinuationToken的存在即可。您可以启动并行处理来处理多个1000个键,而无需处理获取下一页的最后一个键。

感谢提供信息。这很有帮助。我一直在使用原始的boto和boto 3,并且我认为我想要的最终是一个以文件名为键,创建日期为值的字典。对于key in mybucket.list(): print "{name}\t{created}".format( name = key.name, created = key.creation_date, ) 它报错了,我认为这与此无关,但如果我可以得到这样的字典,它应该可以工作。

很高兴知道它对您有帮助。如果它达到了目的,请将答案“标记为接受”。

0