尝试添加到二维列表中,使IndexError:元组索引超出范围

时间:2019-01-06 17:57:45

标签: python-3.x multidimensional-array index-error

我编写了一个函数,该函数将递归浏览目录中的文件夹,并将所有.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

2 个答案:

答案 0 :(得分:0)

您遇到逻辑问题。

您要为count = count+1以外的任何*.dat文件增加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

这将返回一个元组(包含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, ...] 

答案 1 :(得分:0)

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

此外,我设置的for循环将文件放入数组是无效的。我已经通过打开文件并将其分配给变量将文件加载到1d列表中,因此将此1d变量附加到items可以有效地附加整列。另外,请阅读Patrick的文章-我将要声明的列表限制为只有两列/行。不是很好。

代码现在看起来像:

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

另外,感谢杰克修正我的语法。