Как бы я перебрал следующую строку файла в рамках вложенного цикла, используя «for line» в fileinput?

1

Я упустил некоторые из вложенных циклов для простоты примера.

Я перебираю файл построчно, используя fileinput. Если линия удовлетворяет определенному условию, я хочу, чтобы она заменила все будущие строки на '', пока она не встретит условие снова.

import re
import fileinput
with fileinput.FileInput("survey.qsf", inplace=True, backup='.bak') as file:
    for line in file:
        if re.match(r'l'+datamap[i][2]+'.*$',line)!=None:
            line=re.sub(r'.*$','',line)
            while re.match(r'lQID\d*$',line)==None:
                line=re.sub(r'.*$','',line)
                next(line)

Я использовал "next (line)" в качестве заполнителя, так как не могу понять, как перейти к следующей строке, не выходя из внутреннего цикла.

Я хочу иметь возможность перебирать строки, чтобы иметь:

lQID44
xyz
xyz
lQID45

вывод как:

[blank line]
[blank line]
[blank line]
lQID45

Благодарю.

  • 0
    1-е: я бы просто установил логическую переменную в true или false, когда сопоставление происходит, и заменил строки, зависящие от этой переменной. Нет вложенных циклов. 2-й: я бы использовал str.startswith а не re , так как imo здесь тоже подойдет. Однако, возможно, я просто не понял сложного вопроса ...
  • 0
    next(file) дает вам следующую строку итератора. StopIteration в StopIteration , что использование этого может привести к исключению StopIteration , если нет следующей строки, поэтому, возможно, вам следует защитить свой вызов next с помощью try-exc-block, если вы не можете быть уверены, что всегда будет следующая строка ,
Показать ещё 1 комментарий
Теги:
python-3.x
file-io

1 ответ

3
Лучший ответ

next принимает итератор в качестве аргумента.

while re.match(r'lQID\d*$',line)==None:
    line=re.sub(r'.*$','',line)
    try:
        line = next(file)  # Not next(line)
    except StopIteration:
        break

Кроме того, нет необходимости использовать re.sub для замены всей строки пустой строкой; line = '' будет достаточно.

(Кроме того, назначение line не вносит изменений в фактический файл; inplace=True просто означает, что вы можете записывать в file а также читать из него, но вы должны явно записывать в файл, используя print или file.write.)

  • 0
    Привет, спасибо за это. Я думаю, что «next ()» может иметь небольшую проблему при итерации файла, потому что я получаю ошибку StopIIteration, даже если это не последняя строка при использовании next (файл). Спасибо за другие объяснения, хотя этот проект больше, чем я ожидал, и мое программирование нуждается в некоторой изяществе!
  • 1
    Я забыл упомянуть, что вам нужно переназначить его возвращаемое значение на line чтобы вы проверяли новую строку, а не ту же самую предыдущую строку снова и снова. Но это правда, что вызов next явно требует, чтобы вы перехватили StopIteration самостоятельно, когда вы достигли конца файла, в отличие от цикла for который ловит его для вас (в дополнение к неявному вызову next для вас).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню