Python拒绝对文件中的行进行多次迭代

8

我正在编写一个需要多次迭代文件每一行的程序:

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

为了简洁起见,我假设我总是需要循环遍历文件并打印每行5次。这段代码和我程序中实现的长版本一样,存在同样的问题:文件只被迭代一次。之后print(line)什么都没有执行。为什么会出现这种情况?
6个回答

3

这是因为在循环之前只有一次出现了file = open("somefile.txt")这行代码。这会创建一个指向文件中某个位置的光标,所以当你到达第一个循环的末尾时,光标已经到达了文件的末尾。把它放到循环里:

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

"必须"是一个强烈的词。 - charlesreid1

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

这将重新打开文件五次。如果你愿意,你可以使用seek()回到开头。


1

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


1

Python文件对象是迭代器。与其他迭代器一样,在耗尽之前只能迭代一次。尝试再次迭代会导致迭代器立即引发 StopIteration (表示没有可以生成的内容)。

话虽如此,文件对象确实让您有点作弊的机会。与大多数其他迭代器不同,您可以使用它们的 seek 方法重置它们。然后您可以再次迭代其内容。

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

最后一个选择是在程序开始时将文件的全部内容读入列表中,然后对列表进行迭代,而不是直接对文件进行迭代。只要文件够小,可以一次性将其全部内容放入内存中,这可能是最有效的选项。


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)

0

当您迭代文件时,默认情况下将文件视为生成器表达式。如果您想逐行多次迭代文件,则可能需要首先将文件转换为类似列表的东西。

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

for line in lines:
    print(line)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接