在使用readlines和.split()函数时,使用forloop进行迭代会更容易吗?

2024-04-25 03:57:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个while循环来遍历,读取数据.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()

既然readlines是一个字符串列表,并且我希望分割读取每一行,我是否应该创建一个循环遍历的for循环?或者它只是我选择格式化的方式,所以我得到了一个错误的原因?在


Tags: theintxtformatobjecttypelinefile
1条回答
网友
1楼 · 发布于 2024-04-25 03:57:42

当前的问题是使用readlines,而不是line = in_file.readlines()中的readline。这将用文件中所有行的列表填充line,而不是一行。这将导致程序出现两个问题,错误类型的数据将通过循环传播:

  1. 在本例中,在读取非空文件后调用while line,将导致执行循环,因为非空列表的计算结果为true。在
  2. 您在line上调用split。在循环的第一次迭代中,line包含一个字符串列表(其中每个字符串都是文件中的一行)。列表没有split方法-只有单个字符串有。此呼叫失败。在
  3. 如果对split的调用没有失败,并且允许循环运行一次,那么对line = in_file.readline()的后续调用将不会返回文件中的下一行,因为之前对readlines的调用已经读取了所有行,并且在EOF的中间时间段内光标没有重置。循环将终止。在

如果在步骤3中没有最后一次调用,那么循环将永远运行而不终止,因为line的值永远不会更新为非空列表。在


一个最小的变化是调整初始调用,它将一个值赋给line变量给readline(),而不是{},以确保只从文件中读取一行。然后代码中的逻辑应该可以工作。在


您可能会发现以下实现逻辑更容易实现,并说明原因:

  • 收集从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.

相关问题 更多 >