2011-03-22 104 views
-2

我想在文件到达尾部时再次读取文件。再次阅读文件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] 

谢谢您的帮助

+0

什么是你真正想干什么?文件正在改变或为什么你会再次读取文件? – chuck 2011-03-22 09:26:01

+0

什么是停止条件?或者你想要一个一次又一次读取文件的无限循环? – 2011-03-22 09:28:22

+0

“该文件只有逗号分隔的数字。”那你为什么不使用['csv.reader'](http://www.python.org/doc//current/library/csv.html)? – Johnsyweb 2011-03-22 09:49:05

回答

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. 如果你的代码事实上在达到最后时会移动到文件的开始位置,它会一直循环直到内存用完(因为列表不断增长)。

  4. 你可以让你的存储readlines()结果在一个变量,然后把整个for line in all_lines:环路内的另一个while True:要求的行为。 (或者每次关闭,重新打开和重新阅读,如果(a)您担心该文件可能会被另一个程序改变,或者(b)您想避免全部阅读它,对于(b ),你将与for line in infile:取代for line in infile.readlines():。对于(一),注意,试图读取,而别的东西可能会被写入它很可能是一个坏主意,不管你如何做到这一点的文件。)

  5. 我强烈怀疑你所要求的行为不是你真正想要的。通过让你的程序反复读取文件,你试图达到什么目标?

2

'else'分支将永远不会被追求,因为for循环会遍历文件的所有行,然后退出。 如果你想寻道操作必须执行,你必须把它放在外面的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循环,否则请确定退出条件并使用中断操作。

+0

而不是复制并粘贴'for'循环,最好用'for'循环切换'while'条件,以控制内部循环(读取文件)运行的次数。 – imp9 2016-02-15 02:44:47

0

您可以在这里使用itertools.cycle()。
下面是一个例子:

import itertools 
f = open(filename) 
lines = f.readlines() 
f.close() 
for line in itertools.cycle(lines): 
    print line,