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

Python 将 CSV 转为嵌套 XML,核心是:读取 CSV 行数据 → 按逻辑分组(如按某列值归类)→ 构建层级结构 → 用标准库生成合规 XML。关键不在“能不能”,而在“怎么定义嵌套规则”——CSV 本身是扁平的,嵌套关系需你明确指定。
明确嵌套结构(先想清楚再写代码)
CSV 没有天然层级,必须人工约定规则。常见方式有:
-
按字段值分组嵌套:例如 CSV 有
category,name,price,你想让每个 category 成为一个元素,其下包含多个 -
多级父子关系:如含
parent_id和id列,可构建成树形 XML(需递归或字典索引) -
固定模板嵌套:如每行对应一个
,内部固定嵌套+子元素
用 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 结构:
Phone 999 Laptop 1299 Python Crash Course 39 Clean Code 45
对应 Python 代码:
import csv import xml.etree.ElementTree as ET from collections import defaultdict读 CSV 并按 category 分组
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)
构建 XML 树
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']
写入文件(美化缩进可选)
tree = ET.ElementTree(root) tree.write('output.xml', encoding='utf-8', xml_declaration=True)
(可选)添加缩进使 XML 可读(Python 3.9+ 可用 ET.indent)
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 ETdf = pd.read_csv('data.csv') root = ET.Element('root')
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])
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 打开,避免中文乱码。










