我创建了一个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
循环,我想让拆分读入每一行?还是只是我选择格式化的方式,所以这就是为什么我会出错吗?
答案 0 :(得分:0)
当前的问题是使用readlines
,而不是readline
中的line = in_file.readlines()
。这将用文件中所有行的列表而不是一行来填充line
。这将导致程序出现两个问题,其中错误类型的数据将通过循环传播:
while line
会导致执行循环,因为非空列表的计算结果为true。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.