[英]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.