在Python中再次读取文件
我想在文件读到最后的时候,能够重新读取这个文件。
这个文件里面只有用逗号分开的数字。
我在用Python,看到文档上说可以用file.seek(0)来实现这个功能,但对我来说并没有效果。
这是我的代码:
self.users = []
self.index = -1
infile = open(filename, "r")
for line in infile.readlines():
if line != None:
self.users.append(String.split((line),','))
else:
infile.seek(0)
infile.read()
infile.close()
self.index= self._index +1
return self.users[self.index]
谢谢你的帮助
4 个回答
readlines
这个方法已经把整个文件的内容读进了内存,并存放在一个列表里,你可以随意多次遍历这个列表!
如果你想重新读取文件,可以这样做:
infile = file('whatever')
while True:
content = infile.readlines()
# do something with list 'content'
# re-read the file - why? I do not know
infile.seek(0)
infile.close()
infile.read()
会把整个文件的内容读进来,但之后又把这些内容丢掉。你为什么要这么做呢?当你调用
infile.readlines
时,其实你已经把整个文件的内容读进来了。然后你的循环就是在遍历这个结果,而这个结果其实就是一个 Python 列表。即使你把文件指针移到文件开头,这对结果也没有影响。如果你的代码真的在到达文件末尾后又回到了文件开头,它会一直循环下去,直到耗尽内存(因为
users
列表会不断增长)。如果你想要实现你所期望的效果,可以把
readlines()
的结果存储在一个变量里,然后把整个for line in all_lines:
循环放在另一个while True:
循环里。(或者每次都关闭、重新打开并重新读取文件,如果 (a) 你担心文件可能被其他程序修改,或者 (b) 你想避免一次性读取整个文件。对于 (b),你可以把for line in infile.readlines():
替换成for line in infile:
。对于 (a),请注意,如果有其他程序可能在写这个文件,尝试读取它可能会是个坏主意,无论你怎么做。)我很怀疑你想要的行为其实并不是你真正想要的。你想通过让程序不断读取文件来实现什么目标呢?
这里说的是,'else'这个部分永远不会被执行,因为for循环会遍历文件中的所有行,然后就结束了。如果你想让寻址操作(seek)执行,你需要把它放在for循环外面。
self.users = []
self.index = -1
infile = open(filename, "r")
while True:
for line in infile.readlines():
self.users.append(String.split((line),','))
infile.seek(0)
infile.close()
self.index= self._index +1
return self.users[self.index]
问题是,如果你一直循环下去,会耗尽内存。如果你只想读取两次,那就复制粘贴这个for循环;否则,你需要设定一个退出条件,并使用break操作来结束循环。