Как читать впереди в файле при цикле через него с Python? - PullRequest
6 голосов
/ 19 ноября 2011

Я зацикливаюсь на файле и, если я что-то найду, хотел бы прочитать несколько строк в поисках чего-то, прежде чем вернуть управление в основной цикл. Однако я хочу вернуть контроль в тот момент, когда я перестал смотреть в будущее.

Пример кода:

for line in file:
    line = line.strip()
    llist = line.split()

    if llist[0] == 'NUMS':
        # some loop to read ahead and print nums on their own line
        #   until it finds END, then return control to the main for
        #   loop at the point where it stopped looking ahead.

Пример ввода:

NUMS
1
2
3
4
5
END
SOME
MORE
STUFF
NUMS
6
7
8
9
0
END

Желаемый вывод:

1 2 3 4 5
6 7 8 9 0

Я довольно новичок в Python, поэтому, если есть лучший способ сделать это, кроме использования цикла для просмотра вперед, я рад это видеть.

Ответы [ 2 ]

6 голосов
/ 19 ноября 2011

Не стоит читать заранее, если вам это не нужно, как в данном случае.То, что вам нужно сделать, можно выполнить за один цикл for, поддерживая один бит состояния.Это допускает проверку ошибок , а масштабируется до гораздо более сложных требований , чем могут быть обработаны вложенными циклами на одном и том же итераторе.

guff = """NUMS
1
2
etc etc
9
0
END"""

state = ""
for item in guff.split():
    if item == "NUMS":
        if state == "NUMS": print "missing END"
        state = "NUMS"
    elif item == "END":
        if state == "": print "missing NUMS"
        state = ""
        print
    elif state == "NUMS":
        print item,

if state == "NUMS": print # missing END
4 голосов
/ 19 ноября 2011

Когда вы перебираете открытые файлы, вы можете получить каждую строку ровно один раз.Это не похоже на списки, где каждый цикл for получит свой собственный итератор по всему списку.

Вы можете иметь внутренний цикл, «крадущий» строки из файла, чтобы внешний цикл не мог видетьих:

for line in file:
    line = line.strip()
    llist = line.split()

    if llist and llist[0] == 'NUMS':
        for line in file:
            line = line.strip()
            if line == 'END':
                break
            else:
                print line,
        print # newline

Подробнее о том, как работают итераторы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...