17370845950

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

用Python将扁平CSV转为层级XML,关键在于明确数据的层级关系,并用xml.etree.ElementTreelxml逐层构建节点。不需要外部库也能完成,但需提前设计好XML结构。

明确CSV字段与XML层级的映射关系

扁平CSV本身不含嵌套信息,所以必须根据业务逻辑定义“哪一列代表父级”、“哪些列属于同一子节点”。例如:

  • CSV含列:country,province,city,population
  • 期望XML结构:根为,下(含population属性或子元素)

若CSV中存在重复的countryprovince,说明它们是上级分组依据,需去重并按顺序嵌套。

用ElementTree逐步构建层级结构

推荐使用标准库xml.etree.ElementTree,避免依赖第三方。核心思路是:先建根,再对每行数据,逐级查找或创建对应层级的节点(如不存在就新建),最后追加叶子节点。

  • 用字典缓存已创建的元素,避免重复创建
  • 对每一行,先获取country_name,检查是否已有对应;没有则新建并加入根节点
  • 同理,基于province_name在该下找或建
  • 最后把(可带population文本或属性)追加到

处理重复与排序以保证结构清晰

原始CSV顺序可能打乱层级逻辑,建议先用pandascsv模块读取后按关键列排序:

  • 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声明,且可能产生空行,可简单过滤掉空白行

不复杂但容易忽略。