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

如何修复将CSV文件拆分到字典时出现的IndexError: list index out of range

解决IndexError: list index out of range 问题并正确解析CSV到字典

咱们先拆解你遇到的问题和代码里的几个明显的坑:

错误原因分析

你触发IndexError主要是这几个问题导致的:

  1. 第一行数据被直接跳过:你开头执行了quiz=f.readline(),这直接把文件第一行的内容覆盖了初始的空字典quiz,后续的for line in f只会从第二行开始处理,第一行数据完全没被解析到字典里。
  2. 索引逻辑错误:你的CSV每行结构是问题,选项1,选项2,选项3,选项4,正确选项,拆分后parts应该有6个元素(索引0到5)。但你后续判断答案时用了quiz[parts[4]]——这不仅逻辑混乱(parts是循环内的临时变量,循环结束后它只指向最后一行的拆分结果),而且正确答案的索引应该是parts[5]才对。
  3. 未处理空格干扰:你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:13:09