在Python中再次读取文件

-2 投票
4 回答
12604 浏览
提问于 2025-04-16 14:11

我想在文件读到最后的时候,能够重新读取这个文件。

这个文件里面只有用逗号分开的数字。

我在用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 个回答

1

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()
2
  1. infile.read() 会把整个文件的内容读进来,但之后又把这些内容丢掉。你为什么要这么做呢?

  2. 当你调用 infile.readlines 时,其实你已经把整个文件的内容读进来了。然后你的循环就是在遍历这个结果,而这个结果其实就是一个 Python 列表。即使你把文件指针移到文件开头,这对结果也没有影响。

  3. 如果你的代码真的在到达文件末尾后又回到了文件开头,它会一直循环下去,直到耗尽内存(因为 users 列表会不断增长)。

  4. 如果你想要实现你所期望的效果,可以把 readlines() 的结果存储在一个变量里,然后把整个 for line in all_lines: 循环放在另一个 while True: 循环里。(或者每次都关闭、重新打开并重新读取文件,如果 (a) 你担心文件可能被其他程序修改,或者 (b) 你想避免一次性读取整个文件。对于 (b),你可以把 for line in infile.readlines(): 替换成 for line in infile:。对于 (a),请注意,如果有其他程序可能在写这个文件,尝试读取它可能会是个坏主意,无论你怎么做。)

  5. 我很怀疑你想要的行为其实并不是你真正想要的。你想通过让程序不断读取文件来实现什么目标呢?

2

这里说的是,'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操作来结束循环。

撰写回答