如何在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
相关产品推荐
相关产品推荐

