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
相关产品推荐
相关产品推荐

