Python写入XML文件触发IndexError: child index out of range问题求助
解决IndexError: child index out of range问题
嘿,这个问题其实一眼就能看穿——你不小心把自己的变量给覆盖啦!
错误原因分析
你一开始定义了name作为存储车辆信息的字典列表,但在循环内部生成XML元素的时候,写了这行代码:
name=SubElement(obj,'name')
这行代码直接把原来的name列表变量替换成了一个XML Element对象!第一次循环结束后,name已经不再是你最初定义的那个列表了,所以当第二次循环执行name1 = str(name[i]['vehicle'])时,你其实是在尝试对一个XML元素做列表索引和字典取值的操作,这完全不符合它的用法,自然就抛出了IndexError。
修复后的代码
只需要把XML元素的变量名改成和原列表不冲突的名字就行,比如改成obj_name,另外我还帮你修正了两个小细节:
import os import xml.etree.ElementTree as ET from xml.etree.ElementTree import Element, SubElement, Comment, tostring from xml.dom import minidom # 把原列表变量名改成更清晰的vehicle_names,避免冲突 vehicle_names = [{'vehicle': 'honda'}, {'vehicle': 'hyundai'}, {'vehicle': 'mercedes'}, {'vehicle': 'rangerover'}, {'vehicle': 'bentley'}, {'vehicle': 'toyota'}, {'vehicle': 'mecerati'}, {'vehicle': 'lamborgini'}] l = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (1, 0), (1, 2)] # 你的l只有9个元素,原来的range(10)会触发另一个索引错误,改成range(9) for step in range(9): i,j = l[step] print(i,j) name1 = str(vehicle_names[i]['vehicle']) root = Element('annotation') folder = SubElement(root, 'folder') folder.text="testing" filename=SubElement(root, 'filename') filename.text="1.jpg" path=SubElement(root, 'path') path.text="path" source=SubElement(root, 'source') obj=SubElement(root, 'object') # 用obj_name代替name,避免覆盖原列表变量 obj_name=SubElement(obj,'name') obj_name.text=str(name1) tree = ET.ElementTree(root) # 路径里的转义是多余的,直接用f-string生成文件名更简洁 tree.write(os.path.join('testing',f"{step}.xml"))
额外小提示
- 变量命名尽量清晰,比如把原列表改成
vehicle_names,能从根本上避免这类变量名冲突问题; - 注意循环次数和列表长度匹配,你的
l只有9个元素,range(10)会触发另一个索引越界错误; - 文件名里不需要转义点号,直接用
f"{step}.xml"就可以正常生成XML文件。
内容的提问来源于stack exchange,提问作者can I fix it
相关产品推荐
相关产品推荐

