Python中的文件对象是否可迭代?

23

我有一个文件名为"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根本没有被打印出来?

5个回答

54

它不仅是一个可迭代对象,而且还是一个迭代器,这就是为什么它只能遍历文件一次。你可以使用.seek(0)重置文件光标,正如许多人建议的那样,但在大多数情况下,你应该只对文件进行一次迭代。


6
+1 因为你对可迭代对象和迭代器的问题给出了不错、简洁的描述(而其他回答即使这是问题的关键也没有尝试解释)。 - abarnert
1
感谢您提供的描述。 - martinbshp

5
是的,文件对象是迭代器。
像所有的迭代器一样,你只能在它们上面循环一次,之后迭代器就用尽了。你的文件读取指针已经到达了文件末尾。如果你需要再次循环,重新打开文件或使用.seek(0)重置文件指针。
另外,尽量避免两次循环文件;在第一次循环中将所需内容提取到另一个数据结构(列表、字典、集合、堆等)中。

3

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


1
你已经到达文件结尾。文件对象是迭代器,一旦你迭代完它们,你就到了最终位置。再次迭代不会从开头开始。如果你想重新从第一行开始,你需要使用 lines.seek(0)

这是误导性的。list也是可迭代对象,但是你可以在没有seek或等效操作的情况下再次迭代它们。问题在于文件对象是_迭代器_(同时也是可迭代对象)。 - abarnert
笔误,我是指迭代器。谢谢。已修正。 - Mike Müller

0

不过,最好的做法是重写代码,使得文件无需迭代两次。将所有行读入某种列表中,或在单个循环中执行所有处理。


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