从S3桶导入npz文件到SageMaker Notebook报错,求解决方案
问题分析与解决
错误原因
- 依赖版本不兼容:
s3fs与aiobotocore版本不匹配,新版本aiobotocore已移除AioSession类,导致调用失败。 - 文件读取方式错误:你尝试用
Image.open()读取.npz文件,但.npz是NumPy的压缩数组文件,并非图像文件,这步本身就会报错。
解决方案
方案1:修复依赖版本
在SageMaker Notebook中执行以下命令,安装兼容版本的依赖包:
pip install --upgrade s3fs aiobotocore # 或指定稳定兼容版本 pip install s3fs==2023.10.0 aiobotocore==2.7.0
方案2:使用boto3读取(推荐,更稳定)
直接用AWS官方的boto3库下载并读取npz文件:
import boto3 import numpy as np # 初始化S3客户端(SageMaker角色默认有权限访问对应S3桶) s3 = boto3.client('s3') # 定义桶名和文件路径 bucket = 'input_data' file_key = 'train_npz/0.npz' # 下载文件到临时目录(SageMaker允许/tmp路径读写) local_path = '/tmp/0.npz' s3.download_file(bucket, file_key, local_path) # 读取npz文件 with np.load(local_path) as data: # 查看文件内的所有数组名称 print("包含的数组:", data.files) # 访问具体数组,例如data['arr_0'](根据你的npz结构调整) sample_array = data['arr_0'] print("数组形状:", sample_array.shape)
方案3:直接流式读取(无需下载到本地)
使用smart_open库实现流式读取,避免占用本地磁盘空间:
from smart_open import open import numpy as np s3_path = 's3://input_data/train_npz/0.npz' with open(s3_path, 'rb') as f: data = np.load(f) print("包含的数组:", data.files)
注意事项
- 确保SageMaker Notebook的IAM角色拥有访问目标S3桶的权限(
s3:GetObject等权限)。 .npz文件需用numpy.load()读取,不要用图像处理库(如PIL)打开。
内容的提问来源于stack exchange,提问作者PScode
相关产品推荐
相关产品推荐

