Читать файл снова Python - PullRequest
       23

Читать файл снова Python

0 голосов
/ 22 марта 2011

Я хотел бы прочитать файл снова и снова, когда он придет в конце.

Файл состоит только из чисел, разделенных запятой.

Я использую 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 ]

2 голосов
/ 22 марта 2011
  1. infile.read() прочитает весь файл и затем выбросит результат. Почему ты это делаешь?

  2. Когда вы звоните infile.readlines, вы уже прочитали весь файл. Затем ваш цикл перебирает результат, который является просто списком Python. Перемещение к началу файла не повлияет на это.

  3. Если ваш код действительно переместился в начало файла после достижения конца, он просто зациклился бы до тех пор, пока не закончилась память (из-за бесконечно растущего списка users).

  4. Вы можете получить требуемое поведение, сохранив результат readlines() в переменной, а затем поместив весь цикл for line in all_lines: в другой while True:. (Или закрытие, повторное открытие и повторное чтение каждый раз, если (а) вы беспокоитесь о том, что файл может быть изменен другой программой, или (б) вы хотите избежать чтения всего этого за один раз. Для (б) ) вы бы заменили for line in infile.readlines(): на for line in infile:. Для (a) обратите внимание, что попытка прочитать файл, когда что-то еще может писать в него, может быть плохой идеей, независимо от того, как вы это делаете.)

  5. Я сильно подозреваю, что запрашиваемое вами поведение - это не то, чего вы действительно хотите. Какую цель вы пытаетесь достичь, заставляя вашу программу многократно читать файл?

2 голосов
/ 22 марта 2011

Ветвь '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, в противном случае решите условие выхода и используйте операцию разрыва.

1 голос
/ 22 марта 2011

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()
0 голосов
/ 22 марта 2011

Вы можете использовать itertools.cycle () здесь.
Вот пример:

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