使用Python对文件进行迭代

我有一个问题来理解迭代文件,在这里我继续我在解释器上input的结果:

>>> f = open('baby1990.html', 'rU') >>> for line in f.readlines(): >>> print(line) >>> ... >>> ... all the lines from the file appear here >>> ... 

当我尝试迭代同一个打开的文件时,我什么也没有!

 >>> f = open('baby1990.html', 'rU') >>> for line in f.readlines(): >>> print(line) >>> >>> 

根本没有输出,要解决这个我要closures()文件,然后打开它再次阅读! 这是一个正常的行为?

是的,这是正常的行为。 你基本上是第一次读到文件末尾(你可以把它看成是读取磁带),所以除非你重新设置它,否则无法读取它,或者使用f.seek(0)重新定位到文件的开头,或者closures它,然后再打开它,从文件的开头开始。

如果你喜欢,你可以使用with语法代替,它会自动closures你的文件。

例如,

 with open('baby1990.html', 'rU') as f: for line in f: print line 

一旦这个块完成执行,文件会自动closures,这样你就可以重复执行这个块,而不必自己closures文件,并重新读取文件。

当文件对象读取文件时,它使用一个指针来跟踪它的位置。 如果你阅读文件的一部分,然后回到它,它会拾起你离开的地方。 如果你读完整个文件,并返回到同一个文件对象,就像读取一个空文件,因为指针在文件的末尾,没有什么可读的。 您可以使用file.tell()来查看指针所在文件的位置,并使用file.seek来设置指针。 例如:

 >>> file = open('myfile.txt') >>> file.tell() 0 >>> file.readline() 'one\n' >>> file.tell() 4L >>> file.readline() '2\n' >>> file.tell() 6L >>> file.seek(4) >>> file.readline() '2\n' 

此外,你应该知道file.readlines()读取整个文件并将其存储为列表。 这是有用的知道,因为你可以取代:

 for line in file.readlines(): #do stuff file.seek(0) for line in file.readlines(): #do more stuff 

有:

 lines = file.readlines() for each_line in lines: #do stuff for each_line in lines: #do more stuff 

你也可以迭代一个文件,一次一行,而不需要在内存中保存整个文件(这对于非常大的文件可能非常有用)

 for line in file: #do stuff 

文件对象是一个缓冲区 。 从缓冲区中读取时,读取的部分被消耗(读取位置向前移位)。 当读完整个文件时,读取位置在EOF处,所以它什么都不返回,因为没有什么可读的。

如果由于某种原因必须重置文件对象上的读取位置,可以这样做:

 f.seek(0) 

当然。 这是正常和理智的行为。 而不是closures和重新打开,您可以rewind文件。