将扁平的CSV转换为层级化XML,本质是把二维表中的行与列映射成树形节点。Python自带csv与xml模块,可以不需要安装额外依赖就完成这件事。我们首先看一个典型的扁平CSV:每一行代表一条订单明细,同一个订单编号对应多条商品记录。

准备示例数据
假设有以下orders.csv内容:
order_id,customer,product,price 1001,张三,苹果,5 1001,张三,香蕉,3 1002,李四,橙子,4
我们希望转换成按订单分层的XML,每个order包含customer与多个product子节点。
读取并分组CSV数据
使用csv.DictReader读取,并以order_id为键做分组:
import csv
from collections import defaultdict
groups = defaultdict(list)
with open('orders.csv', newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
groups[row['order_id']].append(row)
print(groups)
构建层级化XML
利用xml.etree.ElementTree生成树结构,将分组后的数据写成嵌套元素:
import xml.etree.ElementTree as ET
root = ET.Element('orders')
for order_id, items in groups.items():
order_elem = ET.SubElement(root, 'order', {'id': order_id})
# 取首行中的客户名
ET.SubElement(order_elem, 'customer').text = items[0]['customer']
products = ET.SubElement(order_elem, 'products')
for item in items:
p = ET.SubElement(products, 'product')
ET.SubElement(p, 'name').text = item['product']
ET.SubElement(p, 'price').text = item['price']
tree = ET.ElementTree(root)
tree.write('orders.xml', encoding='utf-8', xml_declaration=True)
输出结果说明
上述代码会生成如下结构的XML文件:
<?xml version='1.0' encoding='utf-8'?>
<orders>
<order id="1001">
<customer>张三</customer>
<products>
<product>
<name>苹果</name>
<price>5</price>
</product>
<product>
<name>香蕉</name>
<price>3</price>
</product>
</products>
</order>
<order id="1002">
<customer>李四</customer>
<products>
<product>
<name>橙子</name>
<price>4</price>
</product>
</products>
</order>
</orders>
注意事项
- 如果CSV含有复杂嵌套关系,可递归构建子元素。
- 字段中若包含<, >, &等字符,ET会自动转义,无需手动处理。
- 大文件建议使用迭代方式读写,避免一次性载入内存。
通过以上方法,你可以灵活地将任意扁平CSV根据业务规则转为层级化XML,且完全基于Python标准库实现。