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

