XML和CSV是两种常用的数据格式,XML适合存储层次化结构的数据,CSV则更适合表格类数据的存储和传输。在实际开发中,经常需要将XML数据转换为CSV格式方便后续处理,Python提供了内置模块可以高效完成这个转换工作。

方法一:使用xml.etree.ElementTree和csv模块实现转换
这种方法使用Python内置的xml.etree.ElementTree解析XML文件,再用csv模块写入CSV文件,不需要安装额外的第三方库,适合简单的XML结构转换。
实现步骤
- 解析XML文件,获取根节点和需要提取的子节点数据
- 确定CSV文件的表头,对应XML中的标签名称
- 遍历XML节点,提取对应数据并写入CSV文件
示例代码
假设我们有如下结构的XML文件data.xml:
<users>
<user>
<id>1</id>
<name>张三</name>
<age>25</age>
<city>北京</city>
</user>
<user>
<id>2</id>
<name>李四</name>
<age>30</age>
<city>上海</city>
</user>
</users>
转换代码如下:
import xml.etree.ElementTree as ET
import csv
def xml_to_csv(xml_path, csv_path):
# 解析XML文件
tree = ET.parse(xml_path)
root = tree.getroot()
# 定义CSV表头
headers = ["id", "name", "age", "city"]
# 打开CSV文件准备写入
with open(csv_path, "w", newline="", encoding="utf-8") as csv_file:
writer = csv.writer(csv_file)
# 写入表头
writer.writerow(headers)
# 遍历每个user节点
for user in root.findall("user"):
row = []
for header in headers:
# 获取对应标签的文本,若没有该标签则填充空字符串
element = user.find(header)
row.append(element.text if element is not None else "")
# 写入一行数据
writer.writerow(row)
if __name__ == "__main__":
xml_to_csv("data.xml", "output.csv")
print("XML转CSV完成")
代码说明
首先通过ET.parse方法解析XML文件,获取根节点users。然后定义CSV的表头,对应XML中user节点下的子标签。接着遍历每个user节点,依次提取表头对应的标签文本,最后将每行数据写入CSV文件。这里使用newline=""避免Windows系统下CSV文件出现空行,encoding="utf-8"保证中文正常显示。
方法二:处理复杂嵌套XML结构
如果XML结构存在多层嵌套,比如user节点下还有子节点,上述方法需要调整解析逻辑,提取嵌套节点的数据。
示例XML结构
<users>
<user>
<id>1</id>
<info>
<name>张三</name>
<age>25</age>
</info>
<city>北京</city>
</user>
</users>
转换代码
import xml.etree.ElementTree as ET
import csv
def xml_to_csv_complex(xml_path, csv_path):
tree = ET.parse(xml_path)
root = tree.getroot()
headers = ["id", "name", "age", "city"]
with open(csv_path, "w", newline="", encoding="utf-8") as csv_file:
writer = csv.writer(csv_file)
writer.writerow(headers)
for user in root.findall("user"):
user_id = user.find("id").text if user.find("id") is not None else ""
# 获取info子节点
info_node = user.find("info")
name = info_node.find("name").text if info_node is not None and info_node.find("name") is not None else ""
age = info_node.find("age").text if info_node is not None and info_node.find("age") is not None else ""
city = user.find("city").text if user.find("city") is not None else ""
writer.writerow([user_id, name, age, city])
if __name__ == "__main__":
xml_to_csv_complex("complex_data.xml", "complex_output.csv")
print("复杂结构XML转CSV完成")
转换注意事项
- 编码问题:XML和CSV文件都建议统一使用UTF-8编码,避免出现中文乱码
- 缺失数据处理:XML中可能存在部分标签缺失的情况,需要在提取数据时做非空判断,避免程序报错
- 特殊字符处理:如果XML标签文本中包含逗号、换行符等CSV特殊字符,csv模块会自动做转义处理,不需要额外操作
- 大文件处理:如果XML文件体积较大,可以使用迭代解析的方式,避免一次性加载整个文件到内存
两种方案对比
| 对比项 | 基础方案 | 复杂结构方案 |
|---|---|---|
| 适用场景 | XML结构扁平,子标签层级简单 | XML存在多层嵌套结构 |
| 实现复杂度 | 低,代码逻辑简单 | 中等,需要逐层解析嵌套节点 |
| 扩展性 | 弱,结构变化需要修改代码 | 强,可灵活调整解析层级 |
通过上述两种方法,开发者可以根据实际的XML结构选择合适的转换方案,快速完成XML到CSV的格式转换,满足数据处理的需求。
XMLCSVPythonXML_to_CSV修改时间:2026-07-19 19:54:12