不确定是什么导致我的代码中出现索引错误

Not sure what is causing index error in my code

我正在从事一个旨在读取、创建和操作虚拟待办事项列表的小项目。有一个 checkbox class,一个函数 open_create_boxes 用于根据纯文本文件的内容创建复选框对象列表,还有一个函数 create_to_do_list_file 用于编写一个文件可以被其他函数读取。

# Define the checkbox class
class checkbox:
    def __init__(self,label):
        self.label = label
        self.checked = False
    def check(self):
        self.checked = True
    def read(self):
        if self.checked:
            return f"x | {self.label}"
        if not self.checked:
            return f"o | {self.label}"

def open_create_boxes(file):
    # Open the to-do list
    opened_list = open(f"{file}.dat", "r")
    #Split the to-do list by line
    parsed_line = opened_list.read().split("\n")
    next_parsed = []
    # Split each element in parsed list by the pipe symbol
    for i in parsed_line:
        next_parsed.append(i.split("|"))
    to_do_list = []
    # Iterates through the new list, creates checkbox object, checks to see if it is "checked" or not
    for i in next_parsed:
        b = checkbox(i[1])
        if i[0] == "x":
            b.check()
        to_do_list.append(b)
    return to_do_list

def create_to_do_list_file(list,label):
    # Open or create a file label.dat
    new_file = open(f"{label}.dat", "w")
    for n in list:
        new_file.write(f"\no|{n}")

create_to_do_list_file(["Task"],"filename")
open_create_boxes("filename")

运行 这段代码给我错误:

  File "/home/genie/Desktop/checkboxes/checkboxes.py", line 41, in <module>
    open_create_boxes("filename")
  File "/home/genie/Desktop/checkboxes/checkboxes.py", line 28, in open_create_boxes
    b = checkbox(i[1])
IndexError: list index out of range

所以我的 open_create_boxes 函数出了点问题,列表中出现了 <2 个元素。我已经多次重写此代码并得到相同或相似的错误。

这里有什么帮助吗?我是初学者,所以我想有一个明显的修复方法,但我似乎无法解决。

谢谢!!

快速 运行 您的代码并检查创建的文件,发现它的第一行是空的。当然,如果您尝试拆分它,您只会得到一个字段。为什么在数据的前面\n

同样,您读取文件的代码无法解释空行,无论是在文件的开头还是结尾。

更切题的是,您忘记关闭您编写的文件,并且通常会使事情过于复杂。

下面是两个 file-management 函数的快速重构。

def open_create_boxes(file):
    to_do_list = []
    with open(f"{file}.dat", "r") as lines:
        for line in lines:
            i = line.rstrip("\n").split("|")
            # print("#", i)
            b = checkbox(i[1])
            if i[0] == "x":
                b.check()
            to_do_list.append(b)
    return to_do_list

# Don't call your variable "list"
def create_to_do_list_file (items ,label):
    with open(f"{label}.dat", "w") as new_file:
        for n in items:
            new_file.write(f"o|{n}\n")

作为调试问题的一般第一个提示,将您的问题分解成更小的步骤并在不同点添加 print 语句以验证变量是否包含您希望它们应该包含的内容,或者使用调试器并设置断点以检查程序在这些位置的状态。