Python 文件操作:XML 格式
XML(eXtensible Markup Language,可扩展标记语言)是一种用于描述结构化数据的文本文件格式。
它以标签(tag)形式组织数据,具有自描述性和层级结构,适用于配置文件、数据交换、文档存储等场景。
几乎所有编程语言都支持 XML 的解析与生成,同时 XML 也兼容多种标准(如 XHTML、SVG、RSS 等)。
一、XML 格式特点
XML 文件的扩展名通常为 .xml。
XML 文件主要特点包括:
(1)标签结构
数据以 <tag> 和 </tag> 包围形成树状结构,可嵌套。
(2)自描述性
每个标签都可以说明其内容的含义。
(3)属性(Attribute)
标签可以包含属性,例如 <student id="1">Alice</student>。
(4)层级关系
支持父子节点、兄弟节点及嵌套节点,表示复杂结构。
(5)编码
推荐使用 UTF-8;在文件开头可声明 <?xml version="1.0" encoding="UTF-8"?>。
(6)注释
使用 <!-- 注释内容 -->。
示例 XML 文件:
<?xml version="1.0" encoding="UTF-8"?><students> <student id="1"> <name>Alice</name> <score>95</score> </student> <student id="2"> <name>Bob</name> <score>88</score> </student> <student id="3"> <name>Carol</name> <score>90</score> </student></students>
以上示例展示了 XML 的基本结构:根节点 <students> 下包含多个 <student> 子节点,每个 <student> 节点又包含 <name> 与 <score>。
二、在 Python 中表示 XML 数据
(1)使用字符串与内存文件对象
当我们想在内存中操作 XML,而不立即写入磁盘时,可以使用 io.StringIO:
from io import StringIO
xml_text = """<?xml version="1.0" encoding="UTF-8"?><students> <student id="1"><name>Alice</name><score>95</score></student> <student id="2"><name>Bob</name><score>88</score></student></students>"""
# 创建内存中文本文件对象buf = StringIO(xml_text)print(buf.read())
StringIO 适用于测试、临时存储或从网络请求中解析小型 XML 内容。
(2)使用字典/列表在内存中表示 XML 树
在处理 XML 数据之前,通常先在内存中准备结构化数据。
示例:
students = [ {"id": 1, "name": "Alice", "score": 95}, {"id": 2, "name": "Bob", "score": 88}, {"id": 3, "name": "Carol", "score": 90},]print(students)
这种结构便于后续生成 XML,每个字典对应一个 <student> 节点。
三、使用 xml.etree.ElementTree 解析与生成 XML
Python 标准库 xml.etree.ElementTree(简称 ET)提供对 XML 的读写支持,能够处理树形结构、节点查找和属性管理。
(1)生成 XML 文件
import xml.etree.ElementTree as ET
# 根节点root = ET.Element("students")
# 添加子节点students = [ {"id": "1", "name": "Alice", "score": "95"}, {"id": "2", "name": "Bob", "score": "88"}, {"id": "3", "name": "Carol", "score": "90"},]
for s in students: student = ET.SubElement(root, "student", id=s["id"]) name = ET.SubElement(student, "name") name.text = s["name"] score = ET.SubElement(student, "score") score.text = s["score"]
# 写入文件tree = ET.ElementTree(root)tree.write("students.xml", encoding="utf-8", xml_declaration=True)print("students.xml 文件已保存。")
说明:
• ET.Element("tag") 创建节点。
• ET.SubElement(parent, "tag") 创建子节点并自动附加到父节点。
• tree.write() 可指定编码与是否写入 XML 声明。
(2)读取 XML 文件
import xml.etree.ElementTree as ET
tree = ET.parse("students.xml")root = tree.getroot()
for student in root.findall("student"): sid = student.get("id") # 获取属性 name = student.find("name").text # 获取子节点文本 score = int(student.find("score").text) print(sid, name, score)
输出结果:
1 Alice 952 Bob 883 Carol 90
说明:
• .find() 查找单个子节点,.findall() 查找所有匹配子节点。
• .get("attr") 获取节点属性值。
• 节点文本通过 .text 获取。
(3)修改与新增节点
import xml.etree.ElementTree as ETtree = ET.parse("students.xml")root = tree.getroot()
# 修改学生分数for student in root.findall("student"): if student.get("id") == "2": student.find("score").text = "90"
# 添加新学生new_student = ET.SubElement(root, "student", id="4")ET.SubElement(new_student, "name").text = "David"ET.SubElement(new_student, "score").text = "70"
tree.write("students_updated.xml", encoding="utf-8", xml_declaration=True)print("students_updated.xml 已更新。")
(4)防止 XML 注入(安全写入)
在处理来自外部的数据时,避免直接写入 XML 标签内容,建议使用 xml.sax.saxutils.escape 对特殊字符进行转义:
from xml.sax.saxutils import escape
name = '<Alice & Bob>'safe_name = escape(name) # 转义为 <Alice & Bob>
这样可防止 <、>、& 等字符破坏 XML 结构。
四、使用 Pandas 处理 XML 文件
从 Pandas 1.3 起,提供了 read_xml 与 to_xml 方法,可方便地将 XML 与 DataFrame 相互转换。
(1)读取 XML 文件
需安装必要的依赖:
pip install pandas lxml
示例:
import pandas as pd
df = pd.read_xml("students.xml")print(df)
输出:
id name score0 1 Alice 951 2 Bob 882 3 Carol 90
pandas 会自动解析节点标签,将属性或子节点转换为列。
(2)筛选与统计数据
# 筛选成绩 >= 90 的学生top_students = df[df["score"] >= 90]print(top_students)
# 平均分avg_score = df["score"].mean()print("平均分:", avg_score)
(3)将结果写回 XML 文件
top_students.to_xml("top_students.xml", index=False)print("高分学生 XML 已保存。")
五、综合案例
以下示例展示了 XML 文件在数据分析中的完整生命周期:数据创建 → 存储 → 读取 → 处理 → 输出。
import xml.etree.ElementTree as ETimport pandas as pd
# 1. 构造原始数据students = [ {"id": "1", "name": "Alice", "score": "95"}, {"id": "2", "name": "Bob", "score": "88"}, {"id": "3", "name": "Carol", "score": "90"}, {"id": "4", "name": "David", "score": "70"},]
# 2. 写入 XML 文件root = ET.Element("students")for s in students: student = ET.SubElement(root, "student", id=s["id"]) ET.SubElement(student, "name").text = s["name"] ET.SubElement(student, "score").text = s["score"]
tree = ET.ElementTree(root)tree.write("students.xml", encoding="utf-8", xml_declaration=True)
# 3. 使用 pandas 读取文件df = pd.read_xml("students.xml")
# 4. 筛选成绩 >= 85 的学生top = df[df["score"] >= 85]
# 5. 计算平均分avg_score = df["score"].mean()
print("高分学生:\n", top)print(f"平均分:{avg_score:.1f}")
# 6. 输出新的 XML 文件top.to_xml("top_students.xml", index=False)
运行结果:
高分学生: id name score0 1 Alice 951 2 Bob 882 3 Carol 90平均分:91.0
📘 小结
XML 作为一种结构化数据格式,具有自描述性和层级结构特点,适用于多种数据场景。使用 Python 处理 XML 数据有两种主要方法:一是使用标准库 xml.etree.ElementTree 进行 XML 的解析、生成和修改,包括节点操作、属性管理和安全写入;二是利用 Pandas 库的 read_xml 和 to_xml 方法实现 XML 与 DataFrame 的高效转换,便于数据分析和处理。

“点赞有美意,赞赏是鼓励”
更多推荐


所有评论(0)