20

我有一个文件“test.txt”:

this is 1st line
this is 2nd line
this is 3rd line

以下代码

lines = open("test.txt", 'r')
for line in lines:
    print "loop 1:"+line
for line in lines:
    print "loop 2:"+line

只打印:

loop 1:this is 1st line

loop 1:this is 2nd line

loop 1:this is 3rd line

它根本不打印loop2。

两个问题:

  1. open() 返回的文件对象,它是可迭代的吗?这就是为什么它可以在 for 循环中使用?

  2. 为什么loop2根本不打印?

4

5 回答 5

52

它不仅是一个可迭代的,还是一个迭代器,这就是它只能遍历文件一次的原因。您可以使用尽可能多的建议重置文件光标,.seek(0)但在大多数情况下,您应该只迭代一次文件。

于 2013-06-07T23:57:22.557 回答
5

是的,文件对象是迭代器。

像所有迭代器一样,您只能对它们进行一次循环,之后迭代器就会耗尽。您的文件读取指针位于文件末尾。重新打开文件,.seek(0)如果需要再次循环,请使用 倒回文件指针。

或者,尽量避免在文件上循环两次;在第一个循环期间将您需要的内容提取到另一个数据结构(列表、字典、集合、堆等)中。

于 2013-06-07T23:56:32.080 回答
3

是的,文件对象是可迭代的,但要回到你需要使用的文件的开头lines.seek(0),因为在第一个循环之后你就在文件的末尾。

于 2013-06-07T23:57:08.673 回答
1

你已经在文件的末尾了。文件对象是迭代器。一旦您遍历它们,您就处于最终位置。再次迭代不会从头开始。如果您想再次从第一行开始,您需要使用lines.seek(0).

于 2013-06-07T23:56:19.310 回答
0

不过,最好重写代码,这样文件就不需要重复两次了。将所有行读入某种列表,或在单个循环中执行所有处理。

于 2013-06-08T00:00:20.300 回答