Я упустил некоторые из вложенных циклов для простоты примера.
Я перебираю файл построчно, используя 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
Благодарю.
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
.)
line
чтобы вы проверяли новую строку, а не ту же самую предыдущую строку снова и снова. Но это правда, что вызов next
явно требует, чтобы вы перехватили StopIteration
самостоятельно, когда вы достигли конца файла, в отличие от цикла for
который ловит его для вас (в дополнение к неявному вызову next
для вас).
str.startswith
а неre
, так как imo здесь тоже подойдет. Однако, возможно, я просто не понял сложного вопроса ...next(file)
дает вам следующую строку итератора.StopIteration
вStopIteration
, что использование этого может привести к исключениюStopIteration
, если нет следующей строки, поэтому, возможно, вам следует защитить свой вызовnext
с помощью try-exc-block, если вы не можете быть уверены, что всегда будет следующая строка ,