En Python 2.6 ou mieux:
def doit(inf, ouf, thestring, separator='SEPARATOR\n'):
thestring += '\n'
for line in inf:
# here we're always at the start-of-block separator
assert line == separator
blockid = next(inf)
if blockid == thestring:
# found block of interest, use enumerate to count its lines
for c, line in enumerate(inf):
if line == separator: break
assert line == separator
# emit results and terminate function
ouf.writelines((separator, thestring, '(%d)' % c, separator))
inf.close()
ouf.close()
return
# non-interesting block, just skip it
for line in inf:
if line == separator: break
Dans les versions de Python plus anciens, vous pouvez faire presque la même , mais modifiez la ligne blockid = next(inf)
à blockid = inf.next()
.
Les hypothèses ici sont que les fichiers d'entrée et de sortie sont ouverts par l'appelant (qui passe aussi dans les valeurs intéressantes de thestring
, et éventuellement separator
), mais il est le travail de cette fonction pour les fermer (par exemple, pour la facilité d'utilisation maximale comme un filtre de canalisation, avec inf de sys.stdin
et ouf de sys.stdout
); facile à modifier si nécessaire, bien sûr. La suppression des assert
va accélérer le microscopique, mais j'aime leur rôle de "vérification de la santé" (et ils peuvent aussi aider à comprendre la logique du flux de code).
La clé de cette approche est qu'un fichier est un iterator (de lignes) et itérateurs peut être avancée à plusieurs endroits (afin que nous puissions avoir plusieurs for
déclarations ou spécifique « faire avancer l'itérateur » appels tels que next(inf)
, et ils coopérer correctement).
salut, ça ne marche pas – user