我有一个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 :(得分: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个密钥的多个而不处理 用最后一个键来获取下一页。