我对编程相当陌生,我想知道索引中的一些东西。 我正在尝试制作一个可以键入单词的程序(我已经让这部分代码正常工作(,但是每当我运行带有索引的代码时,我都会收到此错误:列出索引超出范围。 我想知道这可能意味着什么。
谢谢。
from pynput.keyboard import Key, Controller
keyboard = Controller()
x = 0
file = open("A:\Development\Languages\Python\Programs\NEWTEXT.txt", "r" )
for line in file:
fields = line.split(";")
while x < 340:
song = fields[x]
keyboard.type(song)
x = x + 1
file.close()
exit()
split 函数返回一个列表。例如,在fields = split("cat;dog;mouse")
中,字段将被["cat", "dog", "mouse"]
。在这种情况下,有 3 个元素,如果您尝试访问超过fields[2]
的任何内容,您将收到越界错误。
在您的情况下,您的循环会尝试访问fields[339]
,如果您的字段列表包含少于 340 个元素,这将产生错误。
欢迎来到 SO!
您的错误意味着您正在尝试读取超出其长度的列表内容。例如,如果我创建一个包含 3 个项目的列表:
mylist = ['a', 'b', 'c']
this_does_not_exist = mylist[4] # this is undefined -> IndexError
尝试读取包含 3 个项目的列表的第 4 个元素是没有意义的,它没有定义,所以 python 会向你抛出一个IndexError
。
在您的情况下,读取songs = fields[x]
的行必须对 x 到 339 的所有值有效,换句话说,您的line
必须至少具有这么多值才能使代码正常工作。您可以使用len(fields)
获取列表的长度,而不是尝试猜测它,然后像这样使用它:
for field in fields:
# now field contains fields[x]
keyboard.type(field)
这被认为比像你一样使用while
更 pythonic(这也可以,但需要你编写更多的代码(。
您可以在 python 文档中阅读有关IndexError
的更多信息。
因此,假设您的 NEWTEXT.txt文件内容如下所示:
jason;josh;christian;
您可以修改代码以独立于元素数量运行,如下所示:
from pynput.keyboard import Key, Controller
keyboard = Controller()
with open('A:\Development\Languages\Python\Programs\NEWTEXT.txt') as f:
content = f.read()
for song in content.split(';'):
keyboard.type(song)
但我建议分享您的文件内容以获得更合适的答案。
当您尝试使用数组索引的订阅,但数组太小而无法提供该索引时,会导致该错误,例如:
l = [1,2,3,4] # The only available indexes are 0, 1, 2 and 3
print(l[6]) # This will trigger the index error
我要补充一点,在您的代码中使用 like 打开和关闭文件被认为是一种不好的做法,上下文管理器通常更受欢迎。
在python中,你可以直接遍历数组的元素,所以你不必使用并不断更新索引x
:
from pynput.keyboard import Key, Controller
keyboard = Controller()
with open("A:\Development\Languages\Python\Programs\NEWTEXT.txt", "r") as file:
fields = [line.replace(";"," ") for line in file]
for song in fields:
keyboard.type(song)
exit()