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

如何在SageMaker Notebook Instance中读取并解析S3的XML文件?

解决SageMaker Notebook中解析S3 XML文件的FileNotFoundError问题

首先得明确报错原因:xml.etree.ElementTree.parse()只能处理本地文件路径或者已打开的本地文件对象,它没法直接识别S3的s3://格式URL,所以才会抛出找不到文件的错误。

下面给你两个实用的解决办法,按需选择:

方法1:先把S3文件下载到本地再解析

这个方法适合文件较大,或者你需要保留本地副本的场景:

import boto3
import xml.etree.ElementTree as ET
import os

# SageMaker Notebook默认会自动加载IAM角色权限,无需额外配置密钥
s3 = boto3.client('s3')

# 定义S3桶名和文件路径
bucket_name = 'data-bucket'
file_key = '1.xml'
local_tmp_path = '/tmp/1.xml'  # SageMaker的/tmp是临时存储,实例重启后会清空

# 下载文件到本地临时目录
s3.download_file(bucket_name, file_key, local_tmp_path)

# 解析本地文件
tree = ET.parse(local_tmp_path)
root = tree.getroot()

# (可选)解析完成后删除临时文件,节省空间
os.remove(local_tmp_path)

方法2:直接读取S3文件内容到内存解析(更高效)

这个方法无需下载文件,直接把S3文件内容加载到内存转换成文件对象,适合小文件或追求效率的场景:

import boto3
import xml.etree.ElementTree as ET
from io import BytesIO

# 初始化S3客户端
s3 = boto3.client('s3')

# 获取S3文件的二进制内容
bucket_name = 'data-bucket'
file_key = '1.xml'
response = s3.get_object(Bucket=bucket_name, Key=file_key)
file_content = response['Body'].read()

# 将二进制内容包装成可被ElementTree识别的文件对象
file_obj = BytesIO(file_content)

# 解析内存中的文件对象
tree = ET.parse(file_obj)
root = tree.getroot()

额外注意事项

别忘了确认你的SageMaker Notebook Instance关联的IAM角色,已经拥有对目标S3桶的s3:GetObject权限。如果权限不足,即使代码正确也会出现访问被拒绝的错误,你可以在IAM控制台检查角色的权限策略,添加对应的S3访问权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:27:48