Python中的文件对象是可迭代的吗

问题描述 投票:0回答:5

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

python iterable
5个回答
55
投票

它不仅仅是一个iterable,它还是一个iterator[1],这就是为什么它只能遍历文件一次。您可以按照许多人的建议使用

.seek(0)
重置文件光标,但在大多数情况下,您应该只迭代文件一次。

[1]:“文件”对象属于

TextIOBase
类,它是
IoBase
的子类,并且
IoBase
支持迭代器协议。


5
投票

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

与所有迭代器一样,您只能循环它们一次,之后迭代器就会耗尽。您的文件读取指针位于文件末尾。重新打开文件,或者如果需要再次循环,请使用

.seek(0)
倒回文件指针。

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


3
投票

是的,文件对象是可迭代的,但要返回到文件的开头,您需要使用

lines.seek(0)
,因为在第一个循环之后,您位于文件的末尾。


1
投票

您已经位于文件末尾。文件对象是迭代器。一旦你迭代它们,你就处于最终位置。再次迭代不会从头开始。如果您想再次从第一行开始,则需要使用

lines.seek(0)


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.