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)赋值。所有特殊字符(&、、<code>"等)会自动转义。
- 根节点通常叫
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,每行转为<record></record>,字段转子节点:
import csv
import xml.etree.ElementTree as ET
<p>def csv_to_xml(csv_path, xml_path):
root = ET.Element("data")</p><pre class='brush:php;toolbar:false;'>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字符(如未配对的)。如需自定义根名、记录标签或过滤字段,只需修改<code>ET.Element和SubElement的参数即可。










