Я создал цикл while для перебора, чтения файла data.txt, вычисления периметра / площади / вершин, а корень распечатает ответы.
Я застрял здесь:
from Polygon import Polygon
from Rectangle import Rectangle
in_file = open('data.txt', 'r')
line = in_file.readlines()
while line:
type_, num_of_sides = line.split( ) ###ERROR 'list' object has no attribute 'split'
sides = [map(float, in_file.readline().split()) for _ in range(int(num_of_sides))]
print(line)
if type_ == 'P':
poly_object = Polygon(sides)
elif type_ == 'R':
poly_object = Rectangle(sides)
print('The vertices are {}'.format(poly_object.vertices))
print('The perimeter is {}'.format(poly_object.perimeter()))
print('The area is {}'.format(poly_object.area()))
print()
line = in_file.readline()
in_file.close()
Должен ли я создать цикл for
, который проходит через цикл, поскольку readlines
- это список строк, и я хочу, чтобы разделение считывало каждую строку? Или это просто способ форматирования, поэтому я получаю сообщение об ошибке?
Вместо in_file.readlines()
вы должны просто использовать in_file.read()
, затем type_, num_of_sides = line.splitlines()
.
Непосредственной проблемой является использование readlines
, а не readline
в line = in_file.readlines()
. Это заполнит line
списком всех строк из файла, а не отдельной строкой. Это приведет к двум проблемам с вашей программой, когда неправильный тип данных будет распространяться через цикл:
while line
в этом случае после чтения непустого файла вызовет выполнение цикла, потому что непустой список оценивается как истина.split
на line
. На первой итерации цикла line
содержит список строк (где каждая строка была строкой в файле). Списки, в которых нет метода split
- есть только отдельные строки. Этот вызов терпит неудачу.split
не завершился неудачно и цикл был разрешен для выполнения один раз, последующий вызов line = in_file.readline()
не вернул бы следующую строку в файле, так как все строки были прочитаны предыдущим вызовом readlines
, а курсор не сбросить в промежуточный период из EOF. Цикл завершится.Если бы у вас не было последнего вызова на шаге 3, цикл вместо этого будет выполняться вечно без завершения, так как значение line
никогда не будет обновлено до непустого списка.
Минимальное изменение заключается в корректировке начального вызова, который присваивает значение переменной 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.
Вам необходимо заменить
line = in_file.readlines()
наline = in_file.readline()
(в единственном числе).