Ошибка IndexError: ошибка выхода индекса списка за пределы диапазона на python

#python

Вопрос:

Это мой код:

 while True:
print("Type 'done' to finish receipts")
code=input("Enter item code to add:")
items =open("items.txt")
quant=input("Quantity:")
details = items.read()
detailslist = details.split("n")
for a in detailslist:
    fire = a.split("#")
    print (fire)
    b = fire[0]
    c = fire[1]
    d = fire[2]
    dictd = {}
    dictd[b] = c   ' '  ' Quantity: '  ' '   quant  ' '  'Price:'   d
    print (dictd)       
 

Это в items.txt:

 A# Almanac2018# 18.30
B# Almanac2020# 23.80
C# Almanac2021# 16.54
D# Almanac2022# 22.25
 

Я получаю эту ошибку:

 Type 'done' to finish receipts
Enter item code to add:A
Quantity:45
['A', ' Almanac2018', ' 18.30']
{'A': ' Almanac2018  Quantity:  45 Price: 18.30'}
['B', ' Almanac2020', ' 23.80']
{'B': ' Almanac2020  Quantity:  45 Price: 23.80'}
['C', ' Almanac2021', ' 16.54']
{'C': ' Almanac2021  Quantity:  45 Price: 16.54'}
['D', ' Almanac2022', ' 22.25']
{'D': ' Almanac2022  Quantity:  45 Price: 22.25'}
['']
Traceback (most recent call last):
  File "receipt.py", line 12, in <module>
    c = fire[1]
IndexError: list index out of range
 

Я пытаюсь создать программу, которая будет получать товары, поэтому, если бы вы могли предоставить какой-либо код, который был бы полезен.
Любая помощь будет признательна.

Комментарии:

1. Ну, я думаю, в твоем items.txt, там может быть несколько пустых строк. Попробуйте удалить его и сделайте. В противном случае просто оберните код вокруг блоков try и except, а в блоке except просто продолжайте.

2. В файле есть пустые строки в качестве print(fire) отпечатков [''] , а также fire список только с одним элементом, вы получаете сообщение об ошибке для fire[1]

3. Последняя строка(ы) в файле является/являются пустой (- ами).

Ответ №1:

Проблема, с которой вы столкнулись в своем коде, связана с пустыми строками в вашем items.txt файле. Когда есть пустая строка, fire будет решено [''] , что это список только из 1 элемента, поэтому при попытке запуска кода вы получите сообщение об ошибке c = fire[1] . Вы можете добавить проверку, чтобы узнать, пустая это строка или нет:

 for a in detailslist:
    fire = a.split("#")
    if len(fire) > 1:
        print (fire)
        b = fire[0]
        c = fire[1]
        d = fire[2]
        dictd = {}
        dictd[b] = c   ' '  ' Quantity: '  ' '   quant  ' '  'Price:'   d
        print (dictd)
 

Комментарии:

1. я проверил, и в нем нет пустых строк items.txt

2. Возможно, в конце файла появится новая строка

Ответ №2:

Дайте человеку рыбу, накормите его на день… Научите человека ловить рыбу.

Так что это не рыба, а удочка (если вы используете Python версии v3.7 или выше).:

 import pdb #Only need this if python < v3.7

while True:
print("Type 'done' to finish receipts")
code=input("Enter item code to add:")
items =open("items.txt")
quant=input("Quantity:")
details = items.read()
detailslist = details.split("n")
for a in detailslist:
    fire = a.split("#")
    print (fire)
    try:
        b = fire[0]
        c = fire[1]
        d = fire[2]
        dictd = {}
        dictd[b] = c   ' '  ' Quantity: '  ' '   quant  ' '  'Price:'   d
        print (dictd)
    except:
        breakpoint()  # if Python >= v3.7
        pdb.set_trace()  # if Python < v3.7
 

Это означает, что вы можете видеть точную форму и размер «огня», когда возникает ошибка. Это должно помочь вашим усилиям по отладке здесь — и в будущем, когда неизбежно возникнут другие проблемы.