Python拒绝多次遍历文件中的行

时间:2017-10-01 01:44:03

标签: python

我正在编写一个程序,要求我多次遍历文件的每一行:

loops = 0
file = open("somefile.txt")
while loops < 5:
    for line in file:
        print(line)
    loops = loops + 1

为了简洁起见,我假设我总是需要遍历文件并打印每行5次。该代码与我在程序中实现的较长版本具有相同的问题:文件只迭代一次。之后,print(line)文件什么都不做。这是为什么?

6 个答案:

答案 0 :(得分:2)

for loop in range(5):
    with open('somefile.txt') as fin:
        for line in fin:
            print(fin)

这将重新打开文件五次。如果你愿意的话,你可以seek()来开始。

答案 1 :(得分:1)

这是因为file = open("somefile.txt")行在循环之前只出现一次。这会创建一个指向文件中某个位置的光标,因此当您到达第一个循环的末尾时,光标位于文件的末尾。把它移到循环中:

loops = 0
while loops < 5:
    file = open("somefile.txt")
    for line in file:
        print(line)
    loops = loops + 1

答案 2 :(得分:1)

Python文件对象是迭代器。与其他迭代器一样,它们只能在耗尽之前迭代一次。尝试再次迭代会导致迭代器立即引发StopIteration(它没有任何东西可以产生的信号)。

那就是说,文件对象确实让你有点作弊。与大多数其他迭代器不同,您可以使用seek方法回滚它们。然后你可以再次迭代他们的内容。

另一种选择是每次需要迭代时重新打开文件。这很简单,但是(忽略操作系统的磁盘缓存)重复读取文件可能有点浪费。

最后一个选项是将文件的全部内容读入程序开头的列表中,然后在列表上进行迭代,而不是直接在文件上进行迭代。这可能是最有效的选项,只要文件足够小以便一次在内存中拟合它就不是问题。

答案 3 :(得分:0)

for line in file读取每一行一次。如果要从第一行重新开始,可以关闭并重新打开文件。

答案 4 :(得分:0)

当指针指向文件中的最后一行时迭代,所以尝试使用 file.seek(0)而不是在循环中一次又一次地打开文件

    with open('a.txt','r+')as f:
        for i in range(0,5):
            for line in f:
                print(line)
            f.seek(0)

答案 5 :(得分:0)

当您遍历文件时,默认情况下将文件视为生成器表达式。如果您想逐行遍历文件多次,您可能希望先将文件转换为类似列表。

lines = open("somefile.txt").read().splitlines()

for line in lines:
    print(line)