Python可用xml.etree.ElementTree将扁平CSV转为层级XML:先按country、province、city排序,再逐行构建嵌套节点,用字典缓存已创建的父节点,最后用minidom美化输出。

用Python将扁平CSV转为层级XML,关键在于明确数据的层级关系,并用xml.etree.ElementTree或lxml逐层构建节点。不需要外部库也能完成,但需提前设计好XML结构。
明确CSV字段与XML层级的映射关系
扁平CSV本身不含嵌套信息,所以必须根据业务逻辑定义“哪一列代表父级”、“哪些列属于同一子节点”。例如:
- CSV含列:
country,province,city,population - 期望XML结构:根为
,下分→→(含population属性或子元素)
若CSV中存在重复的country和province,说明它们是上级分组依据,需去重并按顺序嵌套。
用ElementTree逐步构建层级结构
推荐使用标准库xml.etree.ElementTree,避免依赖第三方。核心思路是:先建根,再对每行数据,逐级查找或创建对应层级的节点(如不存在就新建),最后追加叶子节点。
立即学习“Python免费学习笔记(深入)”;
- 用字典缓存已创建的
和元素,避免重复创建 - 对每一行,先获取
country_name,检查是否已有对应;没有则新建并加入根节点 - 同理,基于
province_name在该下找或建 - 最后把
(可带population文本或属性)追加到
处理重复与排序以保证结构清晰
原始CSV顺序可能打乱层级逻辑,建议先用pandas或csv模块读取后按关键列排序:
sorted(rows, key=lambda x: (x['country'], x['province'], x['city']))- 这样能确保同一
country的数据连续,便于分组构建 - 若某列为空(如
province为空),需决定跳过、归入默认组,或报错提示——这属于业务规则,代码中要显式处理
保存为格式化XML文件
ElementTree默认输出无缩进。要生成易读的XML,可用xml.dom.minidom美化:
- 用
ET.tostring(root, encoding='utf-8')获取字节流 - 传给
minidom.parseString(...).toprettyxml(indent=' ') - 注意
toprettyxml会在首行加XML声明,且可能产生空行,可简单过滤掉空白行
不复杂但容易忽略。










