AWS boto3 检索 1000 多个文件夹名称,但不能检索文件夹下的对象名称



我有一个具有以下结构的 Amazon S3 存储桶:

bucket_name/level1/level2/level3/level4/..../somefilename1.txt, somefilename2.txt,... somefilename(n).txt

其中多个文件可以在根"文件夹"下。

我只需要获取级别 1 和级别 2 的"文件夹"名称列表。我不需要钻过 2 级。 换句话说,我只需要找回一个列表:bucket_name/level1/level2/名字。 该列表可以超过 2000 个项目。

如果我使用:

s3_keys = s3_client.list_objects(Bucket=bucket, Prefix=prefix, Delimiter='/')

我成功获得了我正在寻找的列表,但仅限于 1000 条记录。

我用谷歌搜索了一下,分页器似乎是一种选择:

keys = []
paginator = s3_client.get_paginator('list_objects')
operation_parameters = {'Bucket': bucket,
'Prefix': filepath}
page_iterator = paginator.paginate(**operation_parameters)
for page in page_iterator:
keys.append(page['Contents'])

但是这种分页器方法是返回存储桶下的每个对象路径....这可以是数十万个对象路径。

我只需要前 2 级路径

请告知如何完成此任务。谢谢。

目录结构示例:

my_bucket/machine1_id/part1_id/../../../..
my_bucket/machine1_id/part2_id/../../../..
.
.
my_bucket/machineN_id/part1_id/../../../..
my_bucket/machineN_id/part2_id/../../../..
.
.
my_bucket/machineN_id/part(n)_id/../../../..
.
.
my_bucket/Building1_id/Room1_size/.../../../..
my_bucket/Building1_id/Room2_size/.../../../..
.
.
my_bucket/BuildingN_id/Room1_size/.../../../..
my_bucket/BuildingN_id/Room2_size/.../../../..
.
.
my_bucket/BuildingN_id/RoomN_size/.../../../..
.
.

等等。 我只对获取所有my_bucket/1st_level/2n_level/的列表感兴趣,除此之外什么都没有。 在我的情况下可以超过 2000 个项目

我正在寻找的返回的字符串列表将是这样的

[
"my_bucket/machine1_id/part1_id/",
"my_bucket/machine1_id/part2_id/",
.
.
"my_bucket/machineN_id/part1_id/",
"my_bucket/machineN_id/part2_id/",
.
.
"my_bucket/machineN_id/part(n)_id/",
.
.
"my_bucket/Building1_id/Room1_size/",
"my_bucket/Building1_id/Room2_size/",
.
.
"my_bucket/BuildingN_id/Room1_size/",
"my_bucket/BuildingN_id/Room2_size/",
.
.
"my_bucket/BuildingN_id/RoomN_size/",
.
.
]

使用原生 boto3 选项无法实现此目的。

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for obj in bucket.objects.all():
if obj.key.endswith('/'):
print(obj.key)

这将打印所有文件夹(实际上每个键都以/结尾(。

如果你想列出level1/level2中的所有对象,你可以使用:

import boto3
s3_client = boto3.client('s3')
paginator = s3_client.get_paginator('list_objects_v2')
response_iterator = paginator.paginate(
Bucket='bucket-name',
Delimiter='/',
Prefix='level1/level2/',
)
for page in response_iterator:
for object in page['Contents']:
print(object['Key'])

最新更新