MYZ*_*MYZ 51 python iteration file
我有一个问题要理解迭代文件,在这里我继续我在解释器上输入的内容和结果:
>>> f = open('baby1990.html', 'rU')
>>> for line in f.readlines():
... print(line)
...
# ... all the lines from the file appear here ...
Run Code Online (Sandbox Code Playgroud)
当我再次尝试迭代同一个打开的文件时,我什么也没得到!
>>> for line in f.readlines():
... print(line)
...
>>>
Run Code Online (Sandbox Code Playgroud)
根本没有输出,为了解决这个问题,我要关闭()文件,然后再打开它进行阅读!! 这是正常的行为吗?
Lev*_*von 81
是的,这是正常的行为.你基本上第一次读到文件的末尾(你可以把它想象为读取磁带),所以你不能再读取它,除非你重置它,通过使用f.seek(0)重新定位到开头的文件,或关闭它,然后再次打开它将从文件的开头开始.
如果您愿意,可以使用with语法代替,它将自动为您关闭文件.
例如,
with open('baby1990.html', 'rU') as f:
for line in f:
print line
Run Code Online (Sandbox Code Playgroud)
一旦此块执行完毕,文件将自动关闭,因此您可以重复执行此块而无需自己明确关闭文件并以此方式再次读取文件.
Bi *_*ico 16
当文件对象读取文件时,它使用指针来跟踪它的位置.如果你阅读了部分文件,那么请稍后再回到它,它将从你离开的地方开始.如果您读取整个文件,并返回到同一个文件对象,它就像读取一个空文件,因为指针位于文件的末尾,没有什么可读的.您可以使用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'
Run Code Online (Sandbox Code Playgroud)
此外,您应该知道file.readlines()读取整个文件并将其存储为列表.这有用,因为您可以替换:
for line in file.readlines():
#do stuff
file.seek(0)
for line in file.readlines():
#do more stuff
Run Code Online (Sandbox Code Playgroud)
有:
lines = file.readlines()
for each_line in lines:
#do stuff
for each_line in lines:
#do more stuff
Run Code Online (Sandbox Code Playgroud)
您还可以迭代一个文件,一次一行,而不是将整个文件保存在内存中(这对非常大的文件非常有用):
for line in file:
#do stuff
Run Code Online (Sandbox Code Playgroud)
文件对象是缓冲区.从缓冲区读取时,将读取您读取的部分(读取位置向前移动).当您读完整个文件时,读取位置位于EOF,因此它不会返回任何内容,因为没有任何内容可供阅读.
如果由于某种原因,您必须重置文件对象上的读取位置,您可以执行以下操作:
f.seek(0)
Run Code Online (Sandbox Code Playgroud)