Непосредственной проблемой является использование readlines
, а не readline
в line = in_file.readlines()
.Это заполнит line
списком всех строк из файла, а не одной строкой.Это приведет к двум проблемам с вашей программой, когда неправильный тип данных будет распространяться через цикл:
- Вызов
while line
, в этом случае после чтения непустого файла вызовет циклбыть выполненным, потому что непустой список оценивается как true. - Вы вызываете
split
на line
.На первой итерации цикла line
содержит список строк (где каждая строка была строкой в файле).Списки, у которых нет split
метода - есть только отдельные строки.Этот вызов завершается ошибкой. - Если вызов
split
не завершился неудачно и цикл был разрешен один раз, последующий вызов line = in_file.readline()
не вернул бы следующую строку в файле, так как всестроки были прочитаны предыдущим вызовом readlines
, и курсор не был сброшен за прошедший период из EOF.Цикл прекратится.
Если у вас не было последнего вызова на шаге 3, вместо этого цикл будет выполняться вечно без завершения, так как значение line
никогда не будет обновлено до-impty list.
Минимальным изменением является настройка начального вызова, который присваивает значение переменной line
для readline()
вместо readlines()
, чтобы обеспечить чтение только одной строки изфайл.В этом случае логика в коде должна работать.
Возможно, вам легче реализовать следующую логику реализации и рассуждать о том, как:
- собрать механизм для чтения из
in_file
вместе в единый блок перед циклом, используя менеджер контекста для автоматического закрытия файла при выходе из блока - , создавая список строк, чего достаточно для простого цикла
for
перебрать
# This context manager will automatically ensure `in_file` is closed
# on leaving the `with` block.
with open('data.txt', 'r') as in_file:
lines = in_file.readlines()
for line in lines:
# Do something with each line; in particular, you can call
# split() on line without issue here.
#
# You do not require any further calls to in_file.readline()
# in this block.