17370845950

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

Python 将 CSV 转为嵌套 XML,核心是:读取 CSV 行数据 → 按逻辑分组(如按某列值归类)→ 构建层级结构 → 用标准库生成合规 XML。关键不在“能不能”,而在“怎么定义嵌套规则”——CSV 本身是扁平的,嵌套关系需你明确指定。

明确嵌套结构(先想清楚再写代码)

CSV 没有天然层级,必须人工约定规则。常见方式有:

  • 按字段值分组嵌套:例如 CSV 有 category, name, price,你想让每个 category 成为一个 元素,其下包含多个
  • 多级父子关系:如含 parent_idid 列,可构建成树形 XML(需递归或字典索引)
  • 固定模板嵌套:如每行对应一个 ,内部固定嵌套
    +
    子元素

用 csv + xml.etree.ElementTree 实现(推荐,无第三方依赖)

这是最轻量、最可控的方式。以下是一个按 category 分组的典型示例:

假设 CSV 文件 data.csv 内容如下:

category,name,price
electronics,Phone,999
electronics,Laptop,1299
books,Python Crash Course,39
books,Clean Code,45

目标 XML 结构:


  
    Phone999
    Laptop1299
  
  
    Python Crash Course39
    Clean Code45
  

对应 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 ET

df = 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 打开,避免中文乱码。