首页 > 解决方案 > 为什么我的 XML 解析数据没有写入我的 CSV?

问题描述

我正在从 xml 解析我的所有数据,并试图将其提供给 CSV。唯一的问题是所有这些都没有填充 CSV,我不确定为什么。我的数据打印正常,而且它都在那里,所以我不确定它为什么不写入我的 csv.. 任何帮助将不胜感激。我的“能源”数据约为 65,000 个值,但只有 2 个值填充了我的 csv。请参阅我附加的python代码。

import xml.etree.ElementTree as ET
mytree = ET.parse('PupilMeasurement110.xml')
myroot = mytree.getroot()
import csv
import numpy as np
from matplotlib import cm

for data in myroot.findall('Results/Average2dData/elt'):
     inte = data.find('Energy').text
     # write data to csv
     with open('mycsv3.csv', 'w', newline='') as f:
          thewriter = csv.writer(f)
          thewriter.writerow(['X', 'Y', 'Intensity'])
          for row in data:
                thewriter.writerow([inte])

我正在解析的 XML 的部分数据部分如下所示:

<Results>
<Average2dData>
<elt>
<Sigma>
<X>-1.1000000</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0913725</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0827451</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0741176</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0654902</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0568627</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0482353</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0396078</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0309804</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0223529</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0137255</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
<elt>
<Sigma>
<X>-1.0050980</X>
<Y>-1.1000000</Y>
</Sigma>
<Energy>0.0000000</Energy>
</elt>
</Average2dData>
</Results>

标签: python-3.xxml-parsingexport-to-csv

解决方案


如果您不为<elt>遇到的每个人编写一个新的 CSV 文件...

pupil_measurement = ET.parse('PupilMeasurement110.xml')
results = pupil_measurement.getroot()   # .getroot() will return the <Results> element

with open('mycsv3.csv', 'w', newline='') as f:
    thewriter = csv.writer(f)
    thewriter.writerow(['X', 'Y', 'Intensity'])
    
    for elt in results.findall('Average2dData/elt'):
        x = elt.find('Sigma/X').text
        y = elt.find('Sigma/Y').text
        inte = elt.find('Energy').text
        thewriter.writerow([x, y, inte])

推荐阅读