繁体   English   中英

列出存储桶中的所有文件夹 - boto3

[英]List all the folders in a bucket - boto3

我正在研究 lambda function ,我需要 S3 存储桶中所有文件夹的列表。 我需要能够遍历每个文件夹并获取所有子文件夹,直到到达树的末尾。

我通过在boto3中使用不同的前缀递归调用list_objects_v2 function 来实现这一点,虽然它确实有效,但它非常慢,对于有很多文件夹的存储桶,lambda 超过了 15 分钟的超时。

我想知道是否有更有效的方法来做到这一点。

更新:示例 output,这就是我现在通过递归调用list_objects_v2得到的。

L1/
L1/hist/
L1/hist/2022-01-03
L1/hist/2022-01-01
...

list_objects_v2()调用返回所有对象的列表。 每个 object 的Key都包含 object 的完整路径。

因此,您可以简单地从所有对象的 Keys 中提取路径:

import boto3

s3_client = boto3.client('s3')

response = s3_client.list_objects_v2(Bucket='my-bucket')

# folder1/folder2/foo.txt --> folder1/folder2
paths = {object['Key'][:object['Key'].rfind('/')] for object in response['Contents'] if '/' in object['Key']}

for path in sorted(paths):
    print(path)

如果您的存储桶包含超过 1000 个对象,那么您将需要使用ContinuationToken或使用分页器遍历结果。 请参阅: list_objects_v2分页器

您可以枚举存储桶中的所有对象,并找到“文件夹”(实际上是直到最后一个分隔符的前缀),并建立一个可用文件夹列表:

seen = set()
s3 = boto3.client('s3')
paginator = s3.get_paginator('list_objects_v2')
for page in paginator.paginate(Bucket='bucket-name'):
    for obj in page.get('Contents', []):
        key = obj['Key']
        folder = key[:key.rindex("/")] if '/' in key else ""
        if folder not in seen:
            seen.add(folder)
            print(folder)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM