我编写了一个函数,该函数将递归浏览目录中的文件夹,并将所有.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
答案 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
另外,感谢杰克修正我的语法。