循环列表。文件结束循环

时间:2015-09-22 03:19:03

标签: python python-3.x

f = open("test.txt", 'r')
fw = open("testouput.txt",'w')

for line in f:
    data = line.strip().split(',')
    while data != '':
        if data[0] == 'rectangle':
            r = Rectangle(float(data[1]), float(data[2]))
        elif data[0] == 'isoceles triangle':
            i = IsocelesTriangle(float(data[1]), float(data[2]))

    fw.write('rectangle, '+ str(r.get_perimeter()) + ',' + str(r.get_area()))                                    #if the object is made
    fw.write('isoceles triangle, ' + str(i.get_perimeter()) + ',' + str(i.get_area()))

我正在阅读一个名单和数字列表,我正在拆分它并取出\n字符。但是通过这个设置我的while data !=''使我的编译器冻结。如果我不使用while循环它会卡在第一个,然后告诉我我的i对象尚未声明,显然是因为循环在第一次迭代后退出。有人能指出我如何检查它是文件的末尾还是列表的最后一项,以便能够看到我是否已完成检查或其他方式循环直到文件结尾,以便我可以打印文本到我的另一个文件?

2 个答案:

答案 0 :(得分:0)

for已经循环。删除while语句。并确保在循环结束之前确实对ri中的对象执行了某些操作,确保它们在使用之前有任何内容。

答案 1 :(得分:0)

听起来有点像你期望循环运行一次,对于整个文件,但它在文件中每行运行。循环中的逻辑只需要处理一行,所以你不能使用fw.write()代码来尝试写三角形和矩形,因为它们不能同时存在于一条线上

如果你按照你的要求做,并在写完结果之前等到文件的末尾,那么只有在文件有一个三角形和一个矩形时才能使用。如果它不止于此,那么当你到达目的地时,你已经扔掉了一个,而且只有最后一个。

所以你需要一些形状更像的东西:

for line in f:                                                           
    data = line.strip().split(',')

    if data[0] == 'rectangle':
        r = Rectangle(...
        fw.write("rectangle...."

    elif data[0] == 'isoceles triangle':
        i = IsocelesTriangle(...
        fw.write("isoceles triangle.."

print("Finished")

这样,对于文件中的每一行,如果是矩形,则创建一个矩形并写入详细信息。如果是三角形,则创建一个并写入详细信息。当文件有一行,两行或十行时,这就可以工作。

(你通常不需要检查你是否在文件的最后一行,for循环将遍历文件中的每一行,然后在它到达结尾时停止。你需要知道最后一行是什么,它将循环变量保留在它的最后一个值上。