Python文本转XML遇IndexError问题求助:仅能读取首行
问题分析与修复方案
核心问题原因
- 全局变量
i的作用域错误:i在循环外初始化,处理第一行时持续累加,到第二行时i已经远大于该行的元素数量(第二行仅1个元素),访问row[i]直接触发IndexError。 - 文本文件第二行仅含单个字段
O,不符合每个条目14个字段的要求,但这是次要问题,核心Bug是i的作用域处理错误。
修复后的代码
import csv import sys # 补充原代码缺失的sys模块导入 from lxml import etree as et csv.field_size_limit(sys.maxsize) root = et.Element("Processes") data = [] with open("test.txt") as file: for row in csv.reader(file, delimiter="|"): # 每行处理前重置索引,确保从当前行第一个字段开始读取 i = 0 # 跳过字段数不足的无效行,避免索引越界 if len(row) < 14: continue name = et.SubElement(root, "name") time = et.SubElement(name, "Time") time.text = row[i] i += 1 clnt = et.SubElement(name, "Client") clnt.text = row[i] i += 1 usr = et.SubElement(name, "User") usr.text = row[i] i += 1 txtstat = et.SubElement(name, "textstatus") txtstat.text = row[i] i += 1 num = et.SubElement(name, "number") num.text = row[i] i += 1 pid = et.SubElement(name, "processid") pid.text = row[i] i += 1 prog = et.SubElement(name, "program") prog.text = row[i] i += 1 randnum = et.SubElement(name, "randomnumber") randnum.text = row[i] i += 1 pidandwp = et.SubElement(name, "processidandwp") pidandwp.text = row[i] i += 1 userclnt = et.SubElement(name, "userclient") userclnt.text = row[i] i += 1 tid = et.SubElement(name, "transactionid") tid.text = row[i] i += 1 add1 = et.SubElement(name, "additional1") add1.text = row[i] i += 1 add2 = et.SubElement(name, "additional2") add2.text = row[i] i += 1 add3 = et.SubElement(name, "additional3") add3.text = row[i] i += 1 # 原代码重复创建多个additional3,保留原逻辑,不需要可自行删除 add3 = et.SubElement(name, "additional3") add3.text = row[i] i += 1 add3 = et.SubElement(name, "additional3") add3.text = row[i] i += 1 add3 = et.SubElement(name, "additional3") add3.text = row[i] data.append(row) xml_datas = et.tostring(root, pretty_print=True, xml_declaration=True, encoding="utf-8") print(xml_datas.decode())
关键修复点
- 将
i = 0移至for row循环内部,确保每行处理时都从第一个字段开始读取。 - 补充原代码缺失的
import sys(原代码调用sys.maxsize但未导入模块)。 - 添加字段数检查逻辑,跳过不符合要求的无效行,避免后续索引越界。
- 原代码重复创建多个
additional3元素,若业务无需求可自行删除多余部分。
内容的提问来源于stack exchange,提问作者Vishwanath B
相关产品推荐
相关产品推荐

