Python将CSV转为嵌套XML的核心是明确嵌套规则:按字段值分组、构建父子树或固定模板;推荐用csv+xml.etree.ElementTree实现,需注意编码、转义及结构预定义。

Python 将 CSV 转为嵌套 XML,核心是:读取 CSV 行数据 → 按逻辑分组(如按某列值归类)→ 构建层级结构 → 用标准库生成合规 XML。关键不在“能不能”,而在“怎么定义嵌套规则”——CSV 本身是扁平的,嵌套关系需你明确指定。
明确嵌套结构(先想清楚再写代码)
CSV 没有天然层级,必须人工约定规则。常见方式有:
-
按字段值分组嵌套:例如 CSV 有
category,name,price,你想让每个 category 成为一个<category>元素,其下包含多个<item> -
多级父子关系:如含
parent_id和id列,可构建成树形 XML(需递归或字典索引) -
固定模板嵌套:如每行对应一个
<record>,内部固定嵌套<header>+<details>子元素
用 csv + xml.etree.ElementTree 实现(推荐,无第三方依赖)
这是最轻量、最可控的方式。以下是一个按 category 分组的典型示例:
假设 CSV 文件 data.csv 内容如下:
立即学习“Python免费学习笔记(深入)”;
category,name,price electronics,Phone,999 electronics,Laptop,1299 books,Python Crash Course,39 books,Clean Code,45
目标 XML 结构:
<root>
<category name="electronics">
<item><name>Phone</name><price>999</price></item>
<item><name>Laptop</name><price>1299</price></item>
</category>
<category name="books">
<item><name>Python Crash Course</name><price>39</price></item>
<item><name>Clean Code</name><price>45</price></item>
</category>
</root>对应 Python 代码:
import csv
import xml.etree.ElementTree as ET
from collections import defaultdict
<h1>读 CSV 并按 category 分组</h1><p>groups = defaultdict(list)
with open('data.csv', newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
groups[row['category']].append(row)</p><h1>构建 XML 树</h1><p>root = ET.Element('root')
for cat_name, items in groups.items():
cat_elem = ET.SubElement(root, 'category', attrib={'name': cat_name})
for item in items:
item_elem = ET.SubElement(cat_elem, 'item')
ET.SubElement(item_elem, 'name').text = item['name']
ET.SubElement(item_elem, 'price').text = item['price']</p><h1>写入文件(美化缩进可选)</h1><p>tree = ET.ElementTree(root)
tree.write('output.xml', encoding='utf-8', xml_declaration=True)</p><h1>(可选)添加缩进使 XML 可读(Python 3.9+ 可用 ET.indent)</h1><p>try:
ET.indent(root, space=' ')
except AttributeError:
pass # 旧版本跳过
处理更复杂嵌套(如父子 ID 树)
若 CSV 含 id, parent_id, title,需构建树结构:
- 先遍历所有行,用字典存
{id: element},同时记录每个节点的子节点列表 - 再找
parent_id为空或为 0 的节点作为根 - 递归或循环将子元素 append 到父元素下
这种场景建议封装一个简单 Node 类或用 defaultdict(list) 存子关系,避免深度递归出错。
用 pandas + xml.etree(适合已有 DataFrame 流程)
如果你已用 pandas 读取 CSV,可直接基于 DataFrame 操作:
import pandas as pd
import xml.etree.ElementTree as ET
<p>df = pd.read_csv('data.csv')
root = ET.Element('root')</p><p>for _, row in df.iterrows():
record = ET.SubElement(root, 'record')
for col in df.columns:
child = ET.SubElement(record, col)
child.text = str(row[col])</p><p>ET.ElementTree(root).write('pandas_output.xml', encoding='utf-8', xml_declaration=True)
注意:这种方式是“行转平级 record”,如需真正嵌套,仍需先 groupby 或 apply 自定义函数构造子结构。
不复杂但容易忽略的是编码和特殊字符——XML 不允许 <, &, " 直接出现,xml.etree 会自动转义,但手动拼接字符串则需用 xml.sax.saxutils.escape()。另外,确保 CSV 用 utf-8 打开,避免中文乱码。










