You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:31:21