Python中IndexError: list out of range报错的排查解决求助
搞定IndexError的几个实用办法
1. 先过滤空行,从根源解决空列表问题
你控制台里的空列表,就是文本里的空行导致的——空行用split()处理后就是空列表[]。读取文件时直接跳过这些空行就行:
# 只保留非空行的分割结果 data: list[list[str]] = [line.split() for line in fh if line.strip()]
这样data里就不会出现空列表,后续循环也不会踩空。
2. 别手动算循环范围,直接遍历更安全
你原来的循环写法有两个坑:
rangeOne = len(data) -1然后for i in range(rangeOne),会漏掉最后一行,因为range(len(data)-1)只到倒数第二行的索引;rangeTwo = len(data[i]) -1再for v in range(rangeTwo),会漏掉当前行的最后一个元素。
换成直接遍历元素,用enumerate还能顺便拿到索引,省心又安全:
for row in data: for idx, word in enumerate(row): if word == "Kompletter": # 这里写你的处理逻辑,比如要拿下一个元素的话,先判断有没有 if idx + 1 < len(row): next_word = row[idx+1] # 执行你的操作
3. 非要用索引循环?那得改对范围
如果习惯用索引遍历,也得把循环范围写对:
for i in range(len(data)): # 直接遍历所有行的索引,不要减1 row = data[i] for v in range(len(row)): # 遍历当前行所有元素的索引,不用减1 if row[v] == "Kompletter": # 后续逻辑
这样就能覆盖所有元素,不会出现越界。
4. 别折腾字典了,二维列表才是正确选择
你试的data = {line.split() for line in fh}是创建集合,但列表不能当集合元素(因为不可哈希),运行起来直接报错,而且集合是无序去重的,完全不适合存每行的分割数据,老老实实用二维列表就行。
完整可运行示例
with open("你的文件名.txt", "r", encoding="utf-8") as fh: data = [line.split() for line in fh if line.strip()] # 搜索关键词 for row_num, row in enumerate(data, start=1): # start=1让行号从1开始,更直观 for word_num, word in enumerate(row, start=1): if word == "Kompletter": print(f"在第{row_num}行第{word_num}个位置找到关键词") if word_num < len(row): print(f"后面跟着的是:{row[word_num]}")
内容的提问来源于stack exchange,提问作者Holly2207
相关产品推荐
相关产品推荐

