You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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/file
  • folder2/folder/file
  • folder2/folder/file2
  • folder3/file

运行代码后会输出:

folder1
folder2
folder3

完全符合你要的仅打印顶层目录名称的需求。

内容的提问来源于stack exchange,提问作者soniccool

火山引擎 最新活动