如何将CSV文件转换成XML格式 Python脚本实现

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)赋值。所有特殊字符(&"等)会自动转义。

  • 根节点通常叫datarecords,每条CSV记录对应一个record子节点
  • 字段名直接作为子节点标签名(如nameage),值设为.text
  • 需要属性时,传字典给SubElement(..., attrib={'id': '1'})

保存与格式化:输出缩进友好的XML文件

默认ElementTree.write()输出无换行缩进。用xml.dom.minidom可美化,但更轻量的做法是手动加换行和缩进——对小到中等文件够用;大文件建议流式写入避免内存压力。

  • 调用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 ET

def 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.ElementSubElement的参数即可。