python индекс неисправности "вне допустимого диапазона" - PullRequest
1 голос
/ 21 июня 2020

Я новичок в программировании, и мне было интересно узнать о некоторых вещах в индексах. Я пытаюсь создать программу, которая будет печатать слова (у меня эта часть кода работает), но всякий раз, когда я запускаю код с индексом в, я получаю эту ошибку: индекс списка вне допустимого диапазона. Мне было интересно, что это может означать.

спасибо.

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()
    

Ответы [ 4 ]

0 голосов
/ 21 июня 2020

Эта ошибка возникает, когда вы пытались использовать подписку на индекс массива, но массив слишком мал для предоставления этого индекса, например:

l = [1,2,3,4] # The only available indexes are 0, 1, 2 and 3

print(l[6]) # This will trigger the index error

Я добавлю это открытие и закрытие файла с подобным в вашем коде считается плохой практикой, обычно более предпочтителен диспетчер контекста.

В 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()
0 голосов
/ 21 июня 2020

Добро пожаловать в SO!

Ваша ошибка означает, что вы пытаетесь прочитать содержимое списка, превышающее его длину. Например, если я создаю список с 3 элементами в нем:

mylist = ['a', 'b', 'c']
this_does_not_exist = mylist[4]  # this is undefined -> IndexError

Попытка прочитать 4-й элемент списка с 3 элементами не имеет смысла, он не определен, поэтому python выдает IndexError у вас.

В вашем случае ваша строка, которая читает songs = fields[x], должна быть действительна для всех значений x до 339, другими словами, ваш line должен иметь как минимум такое количество значений чтобы ваш код работал. Вы можете получить длину своего списка с помощью len(fields) вместо того, чтобы пытаться угадать его, а затем использовать его следующим образом:

for field in fields:
    # now field contains fields[x]
    keyboard.type(field)

Это считается более pythoni c, чем использование while как и вы (что тоже работает, но требует написания дополнительного кода).

Подробнее о IndexError можно прочитать в python docs .

0 голосов
/ 21 июня 2020

Предположим, что содержимое вашего файла 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)

Но я бы порекомендовал поделиться содержимым вашего файла, чтобы получить более подходящие ответы.

0 голосов
/ 21 июня 2020

Функция разделения возвращает список. Например, в fields = split("cat;dog;mouse") поля будут ["cat", "dog", "mouse"]. В этом случае есть 3 элемента, и вы получите ошибку за пределами границ, если попытаетесь получить доступ к чему-либо, превышающему fields[2].

В вашем случае ваш l oop пытается получить доступ к fields[339] , что приведет к ошибке, если ваш список полей содержит менее 340 элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...