Python: для цикла с файлами, как захватить следующую строку внутри forloop?

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

Вот пример кода:

rofile = open('foo.txt', 'r')
for line in rofile:
    print line
    if(line.strip() == 'foo'):
        line = line.next()
        print line
        line = line.next()
        print line
        line = line.next()
        print line

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

РЕДАКТИРОВАТЬ: Извините, что не уточнил детали. rofile - это файловый объект, через который выполняется итерация. Независимо от того, является ли next() реальным методом для получения следующей строки при использовании файла, я не знаю. У меня нет большого опыта работы с файлами в python.

Ответ 1

Вы можете использовать iter для преобразования вашего объекта в итерируемый, который поддерживает next.

irofile = iter(rofile)
for line in irofile:
    print line
    if(line == 'foo'):
        line = next(irofile)  #BEWARE, This could raise StopIteration!
        print line

Как указано в комментариях, если ваш объект уже является итератором, вам не нужно беспокоиться о iter (это имеет место с объектами file). Однако я оставляю его здесь, поскольку он работает для случая любого произвольного итеративного (например, list s).

Ответ 2

В зависимости от типа объекта, который rofile, я могу представить несколько способов сделать это.

Список строк

Если вы можете получить это просто список строк, которые составляют строки файла:

for index, line in enumerate(rofile):
   if line == 'foo':
       for a in range(index, index + HOW_MANY_LINES_YOU_WANT):
           print rofile[a]

Iterable

Если файл уже является итерируемым:

for line in rofile:
    print line
    if line == 'foo':
        for a in range(3): # Just do it 3 times
            print line.next()
            # After this happens and the for loop is restarted,
            # it will print the line AFTER

В этом примере быстрого доступа вы можете увидеть, что он будет работать таким образом как iterable:

>>> k = iter([1,2,3,4])
>>> for a in k:
    print 'start loop'
    print a
    if a == 2:
        print 'in if'
        print k.next()
        print 'end if'
    print 'end loop'


start loop
1
end loop
start loop
2
in if
3
end if
end loop
start loop
4
end loop

Ответ 3

Не используйте цикл for, если вы действительно не хотите что-то делать для каждой строки. Один из вариантов:

try:
    while True:
        line = file.next()
        #do stuff
        if line == 'foo':
            #do other stuff
except(StopIteration):
     #go on with your life

Ответ 4

Вот простой способ сделать это для файлового объекта:

with open('foo.txt', 'r') as rofile:
    for line in rofile:
        print line,
        if line.strip() == 'foo':
            for _ in xrange(3):  # get the next 3 lines
                try:
                    line = rofile.next()
                except StopIteration:
                    break
                print line,

Try/except необходимо в случае, если нет еще трех строк после просмотра строки "foo".

Ответ 5

У меня была аналогичная проблема, и использование оператора continue вместо этого работало в моем случае