【发布时间】:2019-09-22 05:46:15
【问题描述】:
我正在使用 ElementTree xml API 将一些数据从保存在目录中的本地 XML 文件转换为 CSV 文件,XML 文件如下所示
<object>
<name>Eosinophil</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>415</xmin>
<ymin>120</ymin>
<xmax>532</xmax>
<ymax>252</ymax>
</bndbox>
</object>
我正在尝试这个 python 代码来做到这一点:
def parseXML(xmlfile):
tree = ET.parse(xmlfile)
root = tree.getroot()
mainlist = []
for object in root.findall('.//object'):
records = {}
for bndbox in object:
records[bndbox.tag] = bndbox.text.encode('utf8')
mainlist.append(records)
return mainlist
def savetoCSV(newsitems, filename):
fields = ['name', 'pose', 'truncated', 'difficult', 'xmin','ymin', 'xmax','ymax']
with open(filename, 'w') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames = fields)
writer.writeheader()
writer.writerows(newsitems)
没有给出任何错误,但它只是创建了带有正确标题的空 CSV 文件,因为我对这些东西不熟悉,所以我搜索了资源,我认为“root.findall 中的对象”循环中存在问题,请帮助这种情况。
我如下调用这些函数
def main():
newsitems = parseXML('My photo - 09-04-2019_10-11-32.xml')
savetoCSV(mainlist, 'sample.csv')
您能否建议对循环中涉及的 Xpath 以及循环逻辑进行更改
【问题讨论】:
-
你在哪里调用这些函数?
-
@GabrielPellegrino 先生,查看新编辑
-
mainlist传递给savetoCSV()的范围内不存在。将其更改为savetoCSV(newsitems, 'sample.csv') -
您从 parseXML 返回并以“newitems”的形式接收返回。但是当你调用 savetoCSV 时,你用“mainlist”来调用它。您需要将 savetoCSV(mainlist, 'sample.csv') 更改为 savetoCSV(newitems, 'sample.csv')
-
@WillardSolutions 和 Gabriel,即使在这样做之后,它也会给出错误:ValueError: dict contains fields not in fieldnames: 'bndbox'
标签: python xpath xml-parsing