在Python中使用readlines和.split()函数时,使用for循环进行迭代会更容易吗?

时间:2018-09-08 22:52:49

标签: python file for-loop split

我创建了一个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循环,我想让拆分读入每一行?还是只是我选择格式化的方式,所以这就是为什么我会出错吗?

1 个答案:

答案 0 :(得分:0)

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

  1. 在这种情况下,在读取非空文件后调用while line会导致执行循环,因为非空列表的计算结果为true。
  2. 您致电split上的line。在循环的第一次迭代中,line包含一个字符串列表(其中每个字符串都是文件中的一行)。列表不具有split方法-仅单个字符串具有。通话失败。
  3. 如果对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.