对文件进行第二次迭代不起作用[重复]
- 2024-12-13 08:36:00
- admin 原创
- 143
问题描述:
我在迭代文件时遇到了问题。以下是我在解释器中输入的内容和结果:
>>> f = open('baby1990.html', 'rU')
>>> for line in f.readlines():
... print(line)
...
# ... all the lines from the file appear here ...
当我尝试再次迭代同一个打开的文件时,我什么也没得到!
>>> for line in f.readlines():
... print(line)
...
>>>
根本没有输出。为了解决这个问题,我必须重新打开close()
文件然后重新读取!这是正常现象吗?
解决方案 1:
是的,这是正常现象。您第一次基本上读到了文件末尾(您可以将其想象为读磁带),因此除非您重置它,否则您无法再从中读取任何内容,方法是使用 重新定位f.seek(0)
到文件开头,或者关闭它然后再次打开它,这将从文件开头开始。
如果您愿意,您可以使用with
语法,它将自动为您关闭文件。
例如,
with open('baby1990.html', 'rU') as f:
for line in f:
print line
一旦该块执行完毕,文件就会自动关闭,因此您可以重复执行该块而无需亲自明确关闭文件并再次以这种方式读取文件。
解决方案 2:
当文件对象读取文件时,它会使用指针来跟踪文件的位置。如果您读取了文件的一部分,然后稍后返回,它将从您上次中断的地方继续。如果您读取了整个文件,然后返回到同一个文件对象,它将像读取一个空文件一样,因为指针位于文件末尾,没有剩余内容可读取。您可以使用file.tell()
查看文件中指针的位置并file.seek
设置指针。例如:
>>> file = open('myfile.txt')
>>> file.tell()
0
>>> file.readline()
'one
'
>>> file.tell()
4L
>>> file.readline()
'2
'
>>> file.tell()
6L
>>> file.seek(4)
>>> file.readline()
'2
'
此外,您应该知道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
解决方案 3:
文件对象是一个缓冲区。当您从缓冲区读取时,您读取的那部分会被消耗(读取位置会向前移动)。当您读取整个文件时,读取位置位于文件末尾(EOF),因此它不会返回任何内容,因为没有剩余内容可读取。
如果由于某种原因必须重置文件对象的读取位置,您可以执行以下操作:
f.seek(0)
解决方案 4:
当然。这是正常且理智的行为。您可以直接关闭rewind
文件,而不是重新打开。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD