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

如何在SageMaker Jupyter Notebook中列出S3指定子文件夹文件

解决S3指定文件夹内容列出与遍历问题

错误原因

你之前的代码报错是因为把桶名和文件夹路径(S3中称为前缀)合并传给了Bucket类,S3的桶名是独立标识,不能包含路径信息,因此触发了ParamValidationError。

正确实现方式

方式1:使用boto3 Resource API

先指定纯桶名,再通过前缀筛选目标文件夹下的对象,可选择是否递归遍历:

仅列出目标文件夹的直接文件(不递归子文件夹)

import boto3

# 初始化S3资源
s3 = boto3.resource('s3')
bucket_name = '你的存储桶名称'
target_prefix = 'folder1/folder2/'  # 末尾加斜杠,避免匹配到类似folder1/folder2abc的无关前缀

# 获取存储桶对象
bucket = s3.Bucket(bucket_name)

# 筛选指定前缀下的直接文件
for obj in bucket.objects.filter(Prefix=target_prefix, Delimiter='/'):
    # 排除前缀本身(S3会把前缀当作一个"文件夹对象"返回)
    if obj.key != target_prefix:
        print(obj.key)  # 输出文件的完整键(即S3中的路径)

递归列出目标文件夹下所有文件(含子文件夹内的文件)

只需去掉Delimiter='/参数即可:

for obj in bucket.objects.filter(Prefix=target_prefix):
    print(obj.key)

方式2:使用boto3 Client API

如果偏好更底层的Client接口,可参考以下代码:

非递归列出直接文件

import boto3

s3_client = boto3.client('s3')
bucket_name = '你的存储桶名称'
target_prefix = 'folder1/folder2/'

# 调用list_objects_v2获取结果
response = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=target_prefix, Delimiter='/')

# 处理返回的文件内容
if 'Contents' in response:
    for obj in response['Contents']:
        print(obj['Key'])

递归列出所有文件

移除Delimiter参数即可:

response = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=target_prefix)
if 'Contents' in response:
    for obj in response['Contents']:
        print(obj['Key'])

注意:如果目标文件夹下文件数量超过1000个,需要处理分页逻辑(通过NextContinuationToken循环调用list_objects_v2),上述示例为简化版,适用于文件量较少的场景。

核心注意事项

  • 前缀末尾的斜杠/必须添加:确保只匹配folder1/folder2/路径下的对象,避免误匹配前缀相似的其他键。
  • IAM权限:SageMaker Notebook实例需要具备访问该S3桶的权限(通过实例的执行角色策略配置),否则会出现权限报错。
  • Delimiter='/的作用:将前缀下的对象分为直接文件和子文件夹,仅返回直接文件,子文件夹会出现在CommonPrefixes字段中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:13:10