我有一个文件“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。
两个问题:
open()返回的文件对象,是可迭代的吗?这就是为什么它可以在for循环中使用?
为什么loop2根本没有打印?
答案 0 :(得分:32)
它不仅是 iterable ,而是 iterator ,这就是它只能遍历文件一次的原因。您可以使用.seek(0)
重置文件光标,但在大多数情况下,您应该只迭代文件一次。
答案 1 :(得分:3)
是的,文件对象是迭代器。
与所有迭代器一样,只能将它们循环遍历一次,之后迭代器就会耗尽。您的文件读取指针位于文件的末尾。重新打开文件,或者如果需要再次循环,请使用.seek(0)
倒回文件指针。
或者,尽量避免在文件上循环两次;在第一个循环期间将您需要的内容提取到另一个数据结构(列表,字典,集合,堆等)中。
答案 2 :(得分:2)
是的,文件对象是可迭代的,但要返回到文件的开头,您需要使用lines.seek(0)
,因为在第一个循环之后,您位于文件的末尾。
答案 3 :(得分:1)
您已经在文件的末尾。文件对象是迭代器。一旦你迭代它们,你就处于最终位置。再次迭代不会从头开始。如果您想再次从第一行开始,则需要使用lines.seek(0)
。
答案 4 :(得分:0)
但是,重写代码会更好,因此文件不需要迭代两次。将所有行读入某种列表,或在单个循环中执行所有处理。