Python: для цикла с файлами, как захватить следующую строку внутри forloop?
У меня есть файл, который я хочу получить каждую строку за раз, но как только он попадает в определенную строку, мне нужно получить следующую информацию о строках.
Вот пример кода:
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
Когда я вернусь и зациклирую во второй раз, этот первый оператор печати должен напечатать 5-ю строку в файле. Есть ли способ сделать это?
РЕДАКТИРОВАТЬ: Извините, что не уточнил детали. rofile
- это файловый объект, через который выполняется итерация. Независимо от того, является ли next()
реальным методом для получения следующей строки при использовании файла, я не знаю. У меня нет большого опыта работы с файлами в python.
Ответы
Ответ 1
Вы можете использовать iter
для преобразования вашего объекта в итерируемый, который поддерживает next
.
irofile = iter(rofile)
for line in irofile:
print line
if(line == 'foo'):
line = next(irofile) #BEWARE, This could raise StopIteration!
print line
Как указано в комментариях, если ваш объект уже является итератором, вам не нужно беспокоиться о iter
(это имеет место с объектами file
). Однако я оставляю его здесь, поскольку он работает для случая любого произвольного итеративного (например, list
s).
Ответ 2
В зависимости от типа объекта, который rofile
, я могу представить несколько способов сделать это.
Список строк
Если вы можете получить это просто список строк, которые составляют строки файла:
for index, line in enumerate(rofile):
if line == 'foo':
for a in range(index, index + HOW_MANY_LINES_YOU_WANT):
print rofile[a]
Iterable
Если файл уже является итерируемым:
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
В этом примере быстрого доступа вы можете увидеть, что он будет работать таким образом как iterable:
>>> 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
Ответ 3
Не используйте цикл for
, если вы действительно не хотите что-то делать для каждой строки. Один из вариантов:
try:
while True:
line = file.next()
#do stuff
if line == 'foo':
#do other stuff
except(StopIteration):
#go on with your life
Ответ 4
Вот простой способ сделать это для файлового объекта:
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,
Try/except необходимо в случае, если нет еще трех строк после просмотра строки "foo".
Ответ 5
У меня была аналогичная проблема, и использование оператора continue
вместо этого работало в моем случае