CSV转XML需先读取CSV数据,再按结构生成XML节点,核心是字段映射和特殊字符(如、&)的转义处理。

用Python把CSV转成XML,核心是读取CSV数据、按结构生成XML节点。关键在于字段映射、处理特殊字符(如xml.etree.ElementTree构建,安全又可控。
准备:读取CSV并解析表头与行数据
使用csv.DictReader最方便,它自动把首行当字段名,每行返回一个字典,省去索引对齐的麻烦。注意指定编码(如utf-8-sig)兼容带BOM的Excel导出CSV。
- 用
open(file, encoding='utf-8-sig')打开文件,避免中文乱码 - 若CSV无表头,可传
fieldnames=['col1','col2']手动定义 - 空值或缺失列会变成
None,建议提前用row.get('field', '')兜底
构建XML结构:用ElementTree动态生成节点
别用字符串+format拼XML,易出错且不转义。用ET.Element创建根节点,ET.SubElement追加子节点,再用node.text = str(value)赋值。所有特殊字符(&、、"等)会自动转义。
- 根节点通常叫
data或records,每条CSV记录对应一个record子节点 - 字段名直接作为子节点标签名(如
name、age),值设为.text - 需要属性时,传字典给
SubElement(..., attrib={'id': '1'})
保存与格式化:输出缩进友好的XML文件
默认ElementTree.write()输出无换行缩进。用xml.dom.minidom可美化,但更轻量的做法是手动加换行和缩进——对小到中等文件够用;大文件建议流式写入避免内存压力。
立即学习“Python免费学习笔记(深入)”;
- 调用
ET.indent(tree, space=' ')(Python 3.9+原生支持)快速美化 - 旧版本可用
minidom.parseString(ET.tostring(root)).toprettyxml() - 写入时指定
encoding='utf-8'并加xml_declaration=True输出声明行
完整脚本示例(含错误处理)
以下脚本读input.csv,生成output.xml,每行转为,字段转子节点:
import csv import xml.etree.ElementTree as ETdef csv_to_xml(csv_path, xml_path): root = ET.Element("data")
try: with open(csv_path, encoding='utf-8-sig') as f: reader = csv.DictReader(f) for row in reader: record = ET.SubElement(root, "record") for key, value in row.items(): if value is None: value = "" field = ET.SubElement(record, key.strip()) field.text = str(value).strip() # Python 3.9+ 可直接美化 ET.indent(root, space=" ") tree = ET.ElementTree(root) tree.write(xml_path, encoding='utf-8', xml_declaration=True) print(f"✅ 已生成 {xml_path}") except FileNotFoundError: print(f"❌ 文件未找到: {csv_path}") except Exception as e: print(f"❌ 转换失败: {e}")使用示例
csv_to_xml("input.csv", "output.xml")
运行前确保CSV第一行是字段名,内容不含非法XML字符(如未配对的)。如需自定义根名、记录标签或过滤字段,只需修改ET.Element和SubElement的参数即可。










