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

Python将学生成绩文本转字典时line[6]索引越界报错的解决求助

索引越界问题的原因与修复方案

报错根因

当代码遍历到缺失最后一项成绩的行时,执行col.strip().split(",")拆分得到的列表长度不足7,最大可访问索引为len(line)-1,此时直接访问line[6]会超出索引范围触发报错。
结合给出的文件示例,对应场景是amy所在的行因为末尾成绩为空,拆分后的元素列表没有占满7个位置,部分情况下列表长度仅为6,索引最高到5,自然无法取到索引6的值。
额外提一个代码隐患:按照示例的逗号分隔顺序,三个学生姓名jerry/amy/alan是拆分后索引为2的元素,当前代码写的name = line[3]实际取的是第4个分隔字段(也就是5.5/6.2/7.8对应的数值),会导致字典键和实际值不匹配。

具体修复方法

方法1:固定拆分列表长度,兜底缺失值

拆分每行内容后,先给长度不足的列表补默认空值,保证所有要访问的索引都存在,代码调整如下:

myDic = dict()
with open("students.txt", 'r') as openData:
    for col in openData:
        # 拆分后清理每个字段的前后多余空格
        line = [item.strip() for item in col.strip().split(",")]
        # 补全到固定7个字段的长度,缺多少补多少空字符串
        line += [""] * (7 - len(line))
        # 按实际字段位置取值
        q1 = line[0]
        q2 = line[1]
        name = line[2]
        mag = line[4]
        grade = line[6]
        myDic[name] = (q1, q2, mag, grade)
print(myDic)

这种方式处理后,不管最后一项成绩是否存在,访问所有字段索引都不会越界,缺失的成绩会被存储为空字符串,也可以根据需求把补的默认值改成0、None等其他类型。

方法2:对易越界的字段单独加长度判断

不需要修改整体列表结构,在访问最容易出问题的grade字段时,先判断列表长度是否足够,不足就返回默认值:

myDic = dict()
with open("students.txt", 'r') as openData:
    for col in openData:
        line = [item.strip() for item in col.strip().split(",")]
        q1 = line[0]
        q2 = line[1]
        name = line[2]
        mag = line[4]
        # 判断列表长度是否足够访问索引6,不够就返回空字符串
        grade = line[6] if len(line) > 6 else ""
        myDic[name] = (q1, q2, mag, grade)
print(myDic)

这种方式逻辑更轻量,只针对会出问题的字段做兜底,不需要额外修改列表内容。

额外优化建议

  • 用with上下文管理器打开文件,不需要手动调用close()关闭文件句柄,避免资源泄漏
  • 拆分后给每个字段做strip()清理,不然取到的字段值会带逗号后的多余空格,比如姓名会变成' jerry',影响字典键的匹配

内容的提问来源于stack exchange,提问作者user8801738

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 09:27:03