Python读取逗号分隔txt查询ID时报List index out of range如何解决
索引越界报错原因与修复方案
核心问题梳理
- 文件读取逻辑错误:原代码使用
readline()仅读取了文件的第一行,后续遍历的是单个字符串的每个字符,拆分后得到的列表长度不足3,访问file_list[2]直接触发索引越界 - 输入逻辑顺序错误:先将输入强制转为整数再判断是否等于字符串
finished,用户输入finished时会直接触发类型报错 - 语法硬错误:
- 循环体缩进完全错误,行处理、拆分逻辑不在遍历文件内容的循环内
- 对列表类型的
chosen_line调用split()方法,直接触发属性错误 - 把包含字符串前缀的内容(如
"not solo: {0}".format(x))强制转为浮点数,直接触发值错误
- 匹配逻辑错误:需求是匹配第一列的ID值,原代码错误按行号匹配,和需求不符
修正后可运行代码
import math # 预先读取处理所有文件内容,生成ID到对应数据的映射,避免重复读取 id_data_map = {} with open('test.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() # 跳过空行 if not line: continue parts = line.split(',') # 跳过列数不符合的行,从根源避免索引越界 if len(parts) != 3: continue # 格式校验,跳过内容不合法的行 try: row_id = int(parts[0]) float_value = float(parts[1]) tag = parts[2].strip() id_data_map[row_id] = (float_value, tag) except: continue # 处理用户输入 user_input = input("请输入ID数值,结束请输入'finished':") if user_input == 'finished': print("再见。") else: # 校验输入格式 try: target_id = int(user_input) except: print("输入不合法,请输入数字或者finished") exit() # 校验ID是否存在 if target_id not in id_data_map: print(f"未找到ID为{target_id}的记录") exit() float_val, origin_tag = id_data_map[target_id] # 按需求转换属性标签 converted_tag = 'not solo' if origin_tag in ('solo', 'acc') else origin_tag # 计算y值 y = math.sin(6 * float_val - 3 * math.cos(float_val)) y_rounded = round(y, 2) print(f"您查询的ID {target_id} 对应结果如下:") print(f"转换后属性值:{converted_tag}") print(f"y的计算结果:{y_rounded}")
关键优化说明
- 用
with open语法自动管理文件句柄,避免资源泄漏 - 提前过滤空行、列数不符合的行,从根源避免索引越界报错
- 增加多层输入校验、内容合法性校验,避免各类格式报错
- 直接按ID值匹配记录,符合需求的匹配逻辑
- 简化属性转换、y值计算逻辑,删除冗余的无效格式转换代码
内容的提问来源于stack exchange,提问作者nobody
相关产品推荐
相关产品推荐

