You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Boto3 ListObjects获取S3文件夹时名称附加$folder$问题

解决S3 list_objects返回文件夹带$folder$的问题

嘿,这个$folder$后缀其实是S3的历史遗留小坑——早年不少工具为了在对象存储里模拟出“文件夹”的感觉,会创建一个名为FolderName$folder$的空对象来标记这是个“文件夹”。你用Delimiter='/'调用list_objects时,这些模拟文件夹的对象就会混进Contents里,但这可不是获取S3中“文件夹”(本质是对象Key的前缀)的正确姿势。

正确获取“文件夹”的方式

S3本身没有真正的文件夹概念,所谓的文件夹都是对象Key的前缀。当你设置Delimiter='/'时,list_objects会自动把所有以/结尾的前缀归类到CommonPrefixes字段里,这才是你要的真实文件夹列表。

给你改好的代码:

s3 = session.client("s3")
all_info = s3.list_objects(Bucket=bucket_name, Delimiter='/')
# 从CommonPrefixes里提取文件夹前缀
for prefix_info in all_info.get('CommonPrefixes', []):
    # 去掉末尾的/,得到干净的文件夹名
    folder_name = prefix_info.get('Prefix').rstrip('/')
    print(folder_name)

处理遗留的$folder$对象

如果你确实需要处理那些带$folder$的遗留空对象(比如清理掉它们),可以对Contents里的Key做字符串处理:

s3 = session.client("s3")
all_info = s3.list_objects(Bucket=bucket_name, Delimiter='/')
for content in all_info.get('Contents', []):
    key = content.get('Key')
    if key.endswith('$folder$'):
        folder_name = key.replace('$folder$', '')
        print(folder_name)
        # 要是想删除这些遗留对象,解开下面的注释
        # s3.delete_object(Bucket=bucket_name, Key=key)

额外提示:用新版本API更靠谱

list_objects有单次最多返回1000条的限制,而且是旧版API。官方现在推荐用list_objects_v2,不仅效率更高,分页处理也更友好,用法差不多:

s3 = session.client("s3")
# 用分页器处理大量内容
paginator = s3.get_paginator('list_objects_v2')
for page in paginator.paginate(Bucket=bucket_name, Delimiter='/'):
    for prefix_info in page.get('CommonPrefixes', []):
        print(prefix_info.get('Prefix').rstrip('/'))

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:07:41