如何修复将CSV文件拆分到字典时出现的IndexError: list index out of range
解决IndexError: list index out of range 问题并正确解析CSV到字典
咱们先拆解你遇到的问题和代码里的几个明显的坑:
错误原因分析
你触发IndexError主要是这几个问题导致的:
- 第一行数据被直接跳过:你开头执行了
quiz=f.readline(),这直接把文件第一行的内容覆盖了初始的空字典quiz,后续的for line in f只会从第二行开始处理,第一行数据完全没被解析到字典里。 - 索引逻辑错误:你的CSV每行结构是
问题,选项1,选项2,选项3,选项4,正确选项,拆分后parts应该有6个元素(索引0到5)。但你后续判断答案时用了quiz[parts[4]]——这不仅逻辑混乱(parts是循环内的临时变量,循环结束后它只指向最后一行的拆分结果),而且正确答案的索引应该是parts[5]才对。 - 未处理空格干扰:你的CSV里正确选项前面带空格(比如
, C),直接split(",")会得到带空格的字符串,后续答案匹配时会出错,也可能因为意外的格式问题导致拆分后的元素数量不足。
不用csv库的修正方案
咱们手动处理这些问题,不用库也能完美解决:
quiz = {} # 用with语句自动管理文件,不用手动写close(),避免资源泄漏 with open("questions.txt", "r") as f: for line in f: # 先去掉行尾换行符,再拆分,避免最后一个元素带\n clean_line = line.strip("\n") parts = clean_line.split(",") # 统一去掉每个元素的前后空格,解决比如' C'变成'C'的问题 parts = [item.strip() for item in parts] # 加个长度检查,避免因为行格式错误触发IndexError if len(parts) >= 6: question = parts[0] options = parts[1:5] # 提取四个选项 correct_answer = parts[5] # 把问题作为键,选项和正确答案打包存为值,逻辑更清晰 quiz[question] = { "options": options, "correct": correct_answer } # 答题逻辑重构,适配实际的问题数量 for question, info in quiz.items(): print(f"\n{question}") # 给选项加上A/B/C/D的标识 for idx, option in enumerate(info["options"], start=1): print(f"{chr(64+idx)}: {option}") # 64是ASCII的@,+1对应A,以此类推 user_ans = input("Input your answer (A/B/C/D): ").strip().upper() if user_ans == info["correct"]: print("Correct!") else: print(f"Nope, the answer is {info['correct']}")
用csv库的简便方案
如果想更规范地处理CSV(比如未来遇到带逗号的字段也能兼容),csv库会更省心,它能自动处理字段前后的空格:
import csv quiz = {} with open("questions.txt", "r") as f: # skipinitialspace=True 自动去掉每个字段前的空格 reader = csv.reader(f, skipinitialspace=True) for row in reader: if len(row) >= 6: question = row[0] options = row[1:5] correct_answer = row[5] quiz[question] = {"options": options, "correct": correct_answer} # 答题逻辑和上面一致 for question, info in quiz.items(): print(f"\n{question}") for idx, option in enumerate(info["options"], start=1): print(f"{chr(64+idx)}: {option}") user_ans = input("Input your answer (A/B/C/D): ").strip().upper() if user_ans == info["correct"]: print("Correct!") else: print(f"Nope, the answer is {info['correct']}")
关键改进点总结
- 用
with语句处理文件,自动关闭,避免忘记close()导致的资源问题。 - 处理了拆分后的空格干扰,确保选项和答案的格式统一。
- 增加了长度检查,避免因为行格式错误再次触发
IndexError。 - 重构了字典存储结构,把选项和正确答案分开存储,逻辑更清晰。
- 答题逻辑改为遍历字典的实际内容,不再用固定的
range(10),适配文件里的真实问题数量。
内容的提问来源于stack exchange,提问作者lee-tmy
相关产品推荐
相关产品推荐

