Я предполагаю, что изменение количества тире (4 на входе, иногда 4, а иногда 3 на выходе) является ошибкой и фактически нежелательно (поскольку на алгоритм не даже намекают, чтобы объяснить, сколько тире вывод на разные случаи).
Я бы структурировал задачу по чтению и получению одного блока строк за раз:
def readbyblock(f):
while True:
block = []
for line in f:
if line = '----\n': break
block.append(line)
if not block: break
yield block
, чтобы (выборочный) выход можно было аккуратно отделить от входа:
with open('infile.txt') as fin:
with open('oufile.txt', 'w') as fou:
for block in readbyblock(fin):
if 'extractme\n' in block:
fou.writelines(block)
fou.write('----\n')
Это не является оптимальным с точки зрения производительности, если блоки большие, поскольку он имеет отдельный цикл для всех строк в блоке, подразумеваемых в предложении if
. Итак, хороший рефакторинг может быть:
def selectivereadbyblock(f, marker='extractme\n'):
while True:
block = []
extract = False
for line in f:
if line = '----\n': break
block.append(line)
if line==marker: extract = True
if not block: break
if extract: yield block
with open('infile.txt') as fin:
with open('oufile.txt', 'w') as fou:
for block in selectivereadbyblock(fin):
fou.writelines(block)
fou.write('----\n')
Параметризация разделителей (теперь жестко закодированных как «---- \ n» как для входа, так и для вывода) - еще один разумный твик кодирования.