如何使用boto3在AWS S3存储桶中仅打印顶层目录?
仅列出AWS S3存储桶顶层文件夹的实现方案
S3本质是对象存储,没有真正的文件夹结构——所谓的“文件夹”其实是对象键(Key)里的前缀(比如folder1/folder/file里的folder1/)。要高效获取顶层文件夹,不要自己拆分所有对象的键(这会浪费带宽和性能),而是利用S3 API的Delimiter参数来让服务端直接返回顶层前缀分组。
修改后的代码
import boto3 # 初始化S3客户端 client = boto3.client('s3', region_name='us-west-2') # 使用list_objects_v2的分页器(推荐用v2版本,功能更全) paginator = client.get_paginator('list_objects_v2') # 关键:添加Delimiter='/',让S3按斜杠分组顶层前缀 page_iterator = paginator.paginate(Bucket='my-bucket', Delimiter='/') # 用集合存储文件夹名,避免重复(S3本身不会返回重复前缀,但做个保险) top_level_folders = set() for page in page_iterator: # 从每页结果中获取顶层前缀列表(CommonPrefixes就是模拟的文件夹) common_prefixes = page.get('CommonPrefixes', []) for prefix in common_prefixes: # 去掉前缀末尾的斜杠,得到干净的文件夹名 folder_name = prefix['Prefix'].rstrip('/') top_level_folders.add(folder_name) # 按顺序打印顶层文件夹 for folder in sorted(top_level_folders): print(folder)
代码说明
- 为什么用
list_objects_v2:这是S3列表对象的最新API版本,相比旧的list_objects支持更多功能,性能也更好。 Delimiter='/'的作用:告诉S3把所有键按斜杠分割,返回顶层的前缀分组(也就是你要的顶层文件夹),而不是返回所有对象。CommonPrefixes字段:这个字段里存储的就是所有顶层前缀,每个前缀对应一个模拟的文件夹。我们只需要把前缀末尾的斜杠去掉,就是文件夹名称。- 用集合去重:虽然S3不会返回重复的前缀,但用集合可以避免意外的重复情况,最后排序输出更整洁。
效果验证
针对你给出的存储桶结构:
folder1/folder/filefolder2/folder/filefolder2/folder/file2folder3/file
运行代码后会输出:
folder1 folder2 folder3
完全符合你要的仅打印顶层目录名称的需求。
内容的提问来源于stack exchange,提问作者soniccool




