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.
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, list
s).
Selon le type d'objet que rofile
est, je peux penser à deux façons de procéder.
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]
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
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
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.
J'ai eu un problème similaire et utiliser l'instruction continue
a plutôt fonctionné dans mon cas.