J'imagine que la variation du nombre de tirets (4 dans l'entrée, parfois 4 et parfois 3 la sortie) est une erreur et n'est pas vraiment désirée (puisque aucun algorithme n'est même allumé, pour expliquer combien de tirets doivent être sortis à différentes occasions).
Je structurer la tâche en termes de lecture et produisant un bloc de lignes à la fois:
def readbyblock(f):
while True:
block = []
for line in f:
if line = '----\n': break
block.append(line)
if not block: break
yield block
de telle sorte que la sortie (sélective) peut être séparé d'une manière ordonnée à partir de l'entrée:
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')
Ce n'est pas optimal, en termes de performances, si les blocs sont volumineux, car il comporte une boucle distincte sur toutes les lignes du bloc implicite dans la clause if
. Donc, un bon refactoring pourrait être:
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')
les séparateurs Paramétrer (maintenant codé en dur « ---- \ n » pour l'entrée et la sortie) est un autre tweak de codage raisonnable.
Quel code avez-vous essayé? –