python中的file对象是iterable吗
我有一个文件“test.txt”: 下面的代码python中的file对象是iterable吗,python,iterable,Python,Iterable,我有一个文件“test.txt”: 下面的代码 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()返回的
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行开始,则需要使用
行。seek(0)
是的,文件对象是迭代器
与所有迭代器一样,您只能在它们上循环一次,然后迭代器将耗尽。文件读取指针位于文件末尾。重新打开文件,如果需要再次循环,请使用.seek(0)
倒带文件指针
或者,尽量避免在文件上循环两次;在第一个循环期间,将您需要的内容提取到另一个数据结构(列表、字典、集合、堆等)中。是的,文件对象是可编辑的,但要返回到文件的开头,您需要使用
行。seek(0)
,因为在第一个循环之后,您位于文件的末尾。它不仅是可编辑的,还是迭代器,这就是为什么它只能遍历文件一次。您可以按照许多人的建议使用.seek(0)
重置文件光标,但在大多数情况下,您应该只迭代一次文件。不过,最好重写代码,这样文件就不需要迭代两次。将所有行读入某种类型的列表,或者在一个循环中执行所有处理。+1对于iterable-vs.-迭代器这件事,有一个很好的、简洁的描述(尽管它是问题的关键,但大多数其他答案都没有尝试过)。谢谢你的描述。这是误导<代码>列表s也是可编辑的,但是您可以在不使用搜索
或等效程序的情况下再次迭代它们。问题在于文件对象是迭代器(也是可编辑的)。我是说迭代器。谢谢固定的。
loop 1:this is 1st line
loop 1:this is 2nd line
loop 1:this is 3rd line