Trying to add to a 2d list, getting IndexError: tuple index out of range

Trying to add to a 2d list, getting IndexError: tuple index out of range

我写了一个函数,它会递归地遍历目录中的一个文件夹,并将所有 .dat 文件的内容添加到一个二维列表中。每列代表一个文件,每行在一个新行上。我正在使用 for 循环来实现这一点,但是当它试图将此信息放入列表时,我得到了 IndexError: tuple index out of range。我已经研究了将此信息放入列表的各种方法:附加、插入和分配,但它们都出现了类似的错误。

def initialiseitems():
    items = ([], [])
    count = 0
    for root, dirs, files in os.walk("Bundles/Items/", topdown=False):
        for name in files:
            if os.path.splitext(os.path.basename(name))[1] == ".dat":
                if os.path.splitext(os.path.basename(name))[0] != "English":
                    prefile = open(os.path.join(root, name), "r")
                    file = prefile.readlines()
                    for lineNumber in range(0, sum(1 for line in file)):
                        line = file[lineNumber].replace('\n', '')
                        items[count].append(line)
                    count = count+1
    return items

它应该把它们都放在数组中。很明显,将其放入列表的方法是错误的。最好的方法是什么?最好没有外部库。谢谢

编辑:完全错误

Traceback (most recent call last):
  File "C:/Users/Kenzi/PycharmProjects/workshophelper/main.py", line 3, in <module>
items = initialisation.initialiseitems()
  File "C:\Users\Kenzi\PycharmProjects\workshophelper\initialisation.py", line 15, in initialiseitems
items[count].append(line)
IndexError: tuple index out of range

你的逻辑有问题。

您正在为任何 *.dat 文件递增 count = count+1,但不是 English.dat

您使用 count 索引到恰好有 2 个元素的 items = ([], [])

第三个 *.dat 将创建一个计数 2 - 你的索引只有 0 和 1 --> 错误。


您可以简化代码:

def initialiseitems():
    items = ([], [])
    count = 0
    for root, dirs, files in os.walk("Bundles/Items/", topdown=False):
        for name in files: 
            if name.endswith(".dat"):
                if not name.startswith("English"):
                    fullname = os.path.join(root, name)
                    with open(fullname, "r") as f:
                        items[0].append( fullname )
                        items[1].append( [x.strip() for x in f.splitlines()]

    return items

这 returns 一个元组(包含 2 个列表的不可变对象)- 第一个列表包含文件名, 第二个列出文件内容:

(["file1","file2"],[ [ ...content of file 1...],[ ...content of file 2 ...]]

[ ...content of file 1...] 是行的列表,其末尾没有 \n

您可以像这样处理结果:

result = initialiseitems()
for filename,filecontent in zip (result[0],result[1]):
    # filename is a string like "path/path/path/filename"
    # filecontent is a list like [ line1, line2, line3, ...] 

items = ([], []) 将列表声明为元组,而不是列表。不知道它是什么,但它在这里不起作用。我改为 items = []

此外,我设置的用于将文件放入数组的 for 循环效率低下。我已经通过打开文件并将其分配给一个变量将文件加载到一维列表中,因此将此一维变量附加到 items 有效地附加了整列。另外,阅读 Patrick 的 post - 我将我试图声明的列表限制为只有两个 columns/rows。不是很好。

代码现在看起来像:

def initialiseitems():
items = []
count = 0
for root, dirs, files in os.walk("Bundles/Items/", topdown=False):
    for name in files:
        if os.path.splitext(os.path.basename(name))[1] == ".dat":
            if os.path.splitext(os.path.basename(name))[0] != "English":
                prefile = open(os.path.join(root, name), "r")
                file = prefile.readlines()
                items.append(file)
return items

另外,感谢 Jack 修正了我的语法。