开发者

Read file Again Python

I would like to read a file again and again when it arrives at the end.

The file is only numbers separate by comma.

I use python and I read on the doc that file.seek(0) can be use for this but doesn't work for me.

This is my script:

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]
开发者_C百科

Thank you for your help


  1. infile.read() will read in the whole of the file and then throw away the result. Why are you doing it?

  2. When you call infile.readlines you have already read in the whole file. Then your loop iterates over the result, which is just a Python list. Moving to the start of the file will have no effect on that.

  3. If your code did in fact move to the start of the file after reaching the end, it would simply loop for ever until it ran out of memory (because of the endlessly growing users list).

  4. You could get the behaviour you're asking for by storing the result of readlines() in a variable and then putting the whole for line in all_lines: loop inside another while True:. (Or closing, re-opening and re-reading every time, if (a) you are worried that the file might be changed by another program or (b) you want to avoid reading it all in in a single gulp. For (b) you would replace for line in infile.readlines(): with for line in infile:. For (a), note that trying to read a file while something else might be writing to it is likely to be a bad idea no matter how you do it.)

  5. I strongly suspect that the behaviour you're asking for is not what you really want. What's the goal you're trying to achieve by making your program keep reading the file over and over?


The 'else' branch will never be pursued because the for loop will iterate over all the lines of the files and then exit. If you want the seek operation to be executed you will have to put it outside the for loop

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]

The problem is, if you will loop for ever you will exhaust the memory. If you want to read it only twice then copy and paste the for loop, otherwise decide an exit condition and use a break operation.


readlines is already reading the entire file contents into an in-memory list, which you are free to iterate over again and again!

To re-read the file do:

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()


You can use itertools.cycle() here.
Here's an example :

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜