使用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
文件。