У меня есть файл md5sum.txt и программа на Python. Затем я хочу проанализировать некоторые строки из этого файла. Я не понимаю, почему моя программа вызывает исключение, поскольку в списке должно быть два элемента:

import hashlib

checksum_raw = open('F:/md5sum.txt', 'r').read()
cs_list_raw = checksum_raw.split("\n")
cs_list = []
for i in cs_list_raw:
    cs_list.append({
            'sum' : i.split('  ')[0],
            'path' : i.split('  ')[1]
            })
print (cs_list[0])
D:\newfolder\py_projects>py test.py
Traceback (most recent call last):
  File "test.py", line 9, in <module>
    'path' : i.split('  ')[1]
IndexError: list index out of range

Но этот работает хорошо:

import hashlib

checksum_raw = open('F:/md5sum.txt', 'r').read()
cs_list_raw = checksum_raw.split("\n")
cs_list = []
for i in cs_list_raw:
    cs_list.append({
            'sum' : i.split('  ')[0],
            'path' : i.split('  ')[-1]
            })
print (cs_list[0])
D:\newfolder\py_projects>py test.py
{'sum': 'cde56251d6cae5214227d887dee3bab7', 'path': './pics/red-upperleft.png'}

Вот несколько строк из txt файла:

cde56251d6cae5214227d887dee3bab7  ./pics/red-upperleft.png
0730e775a72519aaa450a3774fca5f55  ./pics/red-lowerleft.png
cd8aa5e7fa11b1362ef1869ac6b1aa56  ./pics/blue-lowerleft.png
92091902d3ca753bb858d4682b3fc26b  ./pics/logo-50.jpg
461cbc7ff94fdea8008cab34b611abb8  ./pics/blue-upperright.png
9e18ae797773b2677b1b7b86e2aff28d  ./pics/blue-lowerright.png
...
0
novichek 22 Мар 2020 в 23:44
1
«Я не понимаю, почему моя программа вызывает исключение, поскольку в списке должно быть два элемента», ну, нет. Выполняли ли вы любую отладку, чтобы увидеть, что на самом деле происходит? Даже просто print при ошибке?
 – 
juanpa.arrivillaga
23 Мар 2020 в 00:16
@juanpa.arrivillaga, конечно
 – 
Anton
25 Мар 2020 в 01:30
['cde56251d6cae5214227d887dee3bab7', './pics/red-upperleft.png']
 – 
Anton
25 Мар 2020 в 01:32
В cs_list_raw есть один из i.split(' ')
 – 
Anton
25 Мар 2020 в 01:35

1 ответ

Индексация Python работает таким образом, что -1 соответствует последнему элементу в списке. В вашем случае похоже, что в списке есть только один элемент, и, следовательно, индекс 0 и -1 сопоставляются с одним и тем же элементом. Вы должны перепроверить, все ли строки соответствуют указанному вами формату.

1
JavaiMaster 23 Мар 2020 в 00:00
Конечно, я это знаю, но в списке всего два элемента, поэтому индекс 1 должен быть таким же, как -1. А индексы 0 и -1 не сопоставляются с одним и тем же элементом, как вы видите.
 – 
Anton
25 Мар 2020 в 01:38
Я не говорю, что у каждого элемента в файле есть один элемент. Я говорю, что есть одно значение, которое вызывает сбой вашей программы. Попробуйте распечатать длину списка на каждом этапе и посмотреть, какова будет длина, когда произойдет сбой.
 – 
JavaiMaster
25 Мар 2020 в 07:36