web-dev-qa-db-fra.com

Python: Pour la boucle avec des fichiers, comment saisir la prochaine ligne dans la boucle?

J'ai un fichier que je veux obtenir chaque ligne à la fois, mais une fois qu'il arrive à une ligne spécifique, je dois obtenir les informations suivantes.

Voici un exemple de code:

rofile = open('foo.txt', 'r')
for line in rofile:
    print line
    if(line.strip() == 'foo'):
        line = line.next()
        print line
        line = line.next()
        print line
        line = line.next()
        print line

Lorsque je reviens et que je boucle pour la deuxième fois, cette première instruction print devrait imprimer la 5ème ligne du fichier. Y a-t-il un moyen possible de faire cela?

EDIT: Désolé de ne pas avoir clarifié les détails. rofile est un objet de fichier par lequel je parcours. Je ne sais pas si next() est la vraie méthode pour obtenir la ligne suivante lors de l'utilisation d'un fichier. Je n'ai pas beaucoup d'expérience avec la manipulation de fichiers en python.

13
Rob Avery IV

Vous pouvez utiliser iter pour convertir votre objet en un itérable supportant next.

irofile = iter(rofile)
for line in irofile:
    print line
    if(line == 'foo'):
        line = next(irofile)  #BEWARE, This could raise StopIteration!
        print line

Comme indiqué dans les commentaires, si votre objet est déjà un itérateur, vous n'avez pas à vous soucier de iter (c'est le cas des objets file). Cependant, je le laisse ici car cela fonctionne dans le cas de tout itératif arbitraire (par exemple, lists).

12
mgilson

Selon le type d'objet que rofile est, je peux penser à deux façons de procéder.

Liste de chaînes

Si vous pouvez obtenir simplement une liste de chaînes qui composent les lignes du fichier:

for index, line in enumerate(rofile):
   if line == 'foo':
       for a in range(index, index + HOW_MANY_LINES_YOU_WANT):
           print rofile[a]

Iterable

Si le fichier est déjà un itérable:

for line in rofile:
    print line
    if line == 'foo':
        for a in range(3): # Just do it 3 times
            print line.next()
            # After this happens and the for loop is restarted,
            # it will print the line AFTER

Vous pouvez voir dans cet exemple de quickie que j'ai écrit que cela fonctionnera de la sorte:

>>> k = iter([1,2,3,4])
>>> for a in k:
    print 'start loop'
    print a
    if a == 2:
        print 'in if'
        print k.next()
        print 'end if'
    print 'end loop'


start loop
1
end loop
start loop
2
in if
3
end if
end loop
start loop
4
end loop
1
jdotjdot

N'utilisez pas de boucle for si vous ne voulez pas réellement faire quelque chose pour chaque ligne. Une option pourrait être:

try:
    while True:
        line = file.next()
        #do stuff
        if line == 'foo':
            #do other stuff
except(StopIteration):
     #go on with your life
1
PeterBB

Voici un moyen simple de le faire pour un objet de fichier:

with open('foo.txt', 'r') as rofile:
    for line in rofile:
        print line,
        if line.strip() == 'foo':
            for _ in xrange(3):  # get the next 3 lines
                try:
                    line = rofile.next()
                except StopIteration:
                    break
                print line,

L'essai/sauf est nécessaire au cas où il n'y aurait plus 3 lignes après qu'une ligne 'foo' soit vue.

0
martineau

J'ai eu un problème similaire et utiliser l'instruction continue a plutôt fonctionné dans mon cas.

0
user3857472