【问题标题】:AWS boto3 retrieve more than 1000 folders name, but not object names under the foldersAWS boto3 检索超过 1000 个文件夹名称,但不是文件夹下的对象名称
【发布时间】:2019-12-06 20:53:21
【问题描述】:

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

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

在根“文件夹”下可以有多个文件。

我只需要获取级别 1 和级别 2 的“文件夹”名称列表。我不需要钻过level2。换句话说,我只需要返回一个列表: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/",
    .
    .
]

【问题讨论】:

  • 您能否澄清一下...您是要检索对象名称还是文件夹的名称?你想“进入”子文件夹吗?随意编辑您的问题并提供示例层次结构和您想要的输出列表。

标签: amazon-web-services amazon-s3 boto3


【解决方案1】:

使用本机 boto3 选项无法实现此目的。

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')

for obj in bucket.objects.all():
    if obj.key.endswith('/'):
        print(obj.key)

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

【讨论】:

  • 谢谢....这就是我现在正在做的事情....导致几十万个钥匙回来了。感谢您的确认。我将继续并标记为已回答关闭。
【解决方案2】:

如果您想要列出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'])

【讨论】:

  • 抱歉不清楚。 'level1/level2/' 不是固定名称。这就是为什么我需要这两个级别的所有排列的列表。 level1 可以是 100 个不同的路径“名称”,而 level2 对于每个 level1 路径名称可以有 10 个路径“名称”。希望这可以清除一点。
  • 请编辑您的问题以提供示例目录结构和您希望实现的输出示例。
  • 我编辑了。我希望这能澄清一点。感谢您的帮助
  • 请列出您希望为您提供的目录结构提供的输出列表。例如,不清楚您需要对象名称还是文件夹名称。
  • 添加了一个输出示例...我只是在寻找文件夹名称...基本上是我在编辑问题中显示的字符串列表
猜你喜欢
  • 1970-01-01
  • 2015-06-03
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多