elementtree.parse() 报 filenotfounderror 主因是路径错误,应使用 os.path.join(os.path.dirname(__file__), "data.xml") 构建绝对路径;xml 含命名空间时需传 namespaces 参数;大文件优先用 iterfind() 避免内存溢出;解析编码不匹配时需先二进制读取再手动解码。

ElementTree.parse() 报 FileNotFoundError 怎么办
路径写错是最常见原因,尤其在相对路径下运行脚本时,当前工作目录不等于脚本所在目录。parse() 读的是文件系统路径,不是“项目根目录”或“Python 包路径”。
- 用
os.path.join(os.path.dirname(__file__), "data.xml")拼接绝对路径,避免依赖cd切换目录 - 检查文件扩展名是否真实存在——
"data.xml"和"data.XML"在 Linux/macOS 下是两个文件 - 如果 XML 来自网络或内存字符串,别硬套
parse(),改用ET.fromstring()
用 find() 找不到元素?注意命名空间和层级
XML 带命名空间(如 xmlns="http://example.com/ns")时,find("item") 默认查不到任何东西,因为实际标签是 {http://example.com/ns}item。
- 显式传入命名空间字典:
root.find("ns:item", namespaces={"ns": "http://example.com/ns"}) -
find()只查直接子节点;要查任意后代,用findall(".//item")(注意开头的.和双斜杠) - 返回
None不报错,记得先判空再取.text,否则抛AttributeError
iter() 和 iterfind() 性能差很多,什么场景该用哪个
当 XML 很大、只需处理部分节点时,iter() 会把整个树加载进内存再遍历,而 iterfind() 是惰性求值,边解析边产出匹配节点。
本文档主要讲述的是使用JSON进行网络数据交换传输;JSON(JavaScript ObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,非常适合于服务器与客户端的交互。JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON的数据格式非常简单,您可以用 JSON 传输一个简单的 St
- 处理 GB 级日志类 XML:优先用
tree.iterfind(".//record"),配合del清理已处理节点防内存暴涨 - 需要随机访问父/兄弟节点?
iter()更方便,但得接受内存开销 -
iter()不支持 XPath 谓词(比如item[@type='error']),这种必须用iterfind()
中文乱码或特殊字符报 ParseError: not well-formed
ElementTree 默认按 UTF-8 解析,但 XML 声明里写的是 <?xml version="1.0" encoding="GBK"?>,就会直接崩。
立即学习“Python免费学习笔记(深入)”;
- 先用
open(path, "rb")读二进制,再手动解码:ET.fromstring(data.decode("gbk")) - 别信文件后缀——
.xml文件可能是 ANSI、UTF-8 with BOM、甚至 Shift-JIS,用file -i filename.xml或 VS Code 底部编码提示确认 - 如果 XML 里混了未转义的
&、,ElementTree 会拒绝解析;这不是编码问题,是源数据本身不合法
print(ET.tostring(root, encoding="unicode")) 看一眼解析后的结构,比猜快得多。









