为何Python解析XML数据无法正常写入CSV?Energy值仅2条被写入
问题根因定位
- 核心触发原因:文件打开操作放在了
<elt>节点的遍历循环内部,且使用了覆盖模式'w'打开CSV文件。每遍历一个<elt>节点,程序都会重新从头清空mycsv3.csv的全部原有内容,重新写入表头后再执行写入逻辑,之前所有循环写入的数据都会被下一次循环的文件打开操作直接清除。你最终看到的2条内容,实际是最后一次循环时写入的CSV表头行+循环内遍历到的第一个子节点生成的内容,前面近65000条数据全被反复覆盖丢失。 - 数据提取逻辑错误:代码中
for row in data的遍历对象是每个<elt>节点本身,它的直接子节点为<Sigma>、<Energy>两个标签,你既没有读取<Sigma>节点内部的X、Y坐标值,也没有建立数据和CSV列的对应关系,只是反复把同一个Energy值写入新行,完全匹配不上你CSV表头定义的['X', 'Y', 'Intensity']的列结构。 - 原代码中导入的
numpy、matplotlib.cm模块在逻辑中没有实际使用,不会导致当前问题,可在最终版本中删除精简代码。
修正后的可运行代码
import xml.etree.ElementTree as ET import csv # 解析XML文件 mytree = ET.parse('PupilMeasurement110.xml') myroot = mytree.getroot() # 文件打开操作移到外层循环之外,仅执行一次,避免反复覆盖清空内容 with open('mycsv3.csv', 'w', newline='', encoding='utf-8') as f: thewriter = csv.writer(f) # 表头仅在文件开头写入一次 thewriter.writerow(['X', 'Y', 'Intensity']) # 遍历所有elt节点提取对应数据 for elt in myroot.findall('Results/Average2dData/elt'): sigma_node = elt.find('Sigma') x_val = sigma_node.find('X').text.strip() y_val = sigma_node.find('Y').text.strip() intensity_val = elt.find('Energy').text.strip() # 按照列顺序写入整行数据 thewriter.writerow([x_val, y_val, intensity_val])
后续排查提示
- 如果需要往已有CSV文件追加写入内容,可将打开模式从
'w'换成'a',这种场景下需要判断文件是否为空,仅在空文件时写入表头,避免重复插入表头行。 - 打开文件时指定
encoding='utf-8',可以避免不同操作系统环境下打开CSV出现中文或特殊字符乱码的问题。 - 可以在写入逻辑中增加简单的计数逻辑,每累计写入1000条数据打印一次进度,即可直观校验所有解析到的数据是否全部完成写入,避免出现数据丢失后无法定位的情况。
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

