Ответ 1
Try:
lines = iter(open('something.txt', 'r'))
for val in lines:
if val == "!":
lines.next()
continue
<etc>
Возможно, вы захотите поймать StopIteration
. Это произойдет, если итератор закончен.
Это может быть очень глупый вопрос, однако я огляделся в Интернете и т.д. И не нашел надежного ответа.
Есть ли простой способ сделать что-то вроде этого?
lines = open('something.txt', 'r').readlines()
for line in lines:
if line == '!':
# force iteration forward twice
line.next().next()
<etc>
Это легко сделать в С++; просто увеличивайте итератор до дополнительного времени. Есть ли простой способ сделать это в Python?
Я просто хотел бы указать, что основная цель этого вопроса заключается не в "чтении файлов и т.д.", а в пропуске. Я больше искал итерацию стиля итератора на С++. Также новое название немного глупо, и я действительно не думаю, что оно отражает характер моего вопроса.
Try:
lines = iter(open('something.txt', 'r'))
for val in lines:
if val == "!":
lines.next()
continue
<etc>
Возможно, вы захотите поймать StopIteration
. Это произойдет, если итератор закончен.
Это короткий, пифонический и работает:
with open('something.txt', 'r') as f: # or simply f = open('something.txt', 'r')
nobang = (line for line in f if line != '!\n')
for line in nobang:
#...
Edit:
Как уже отмечалось, это еще не решение. Лучшее, что я могу придумать, это комбинация того, что уже есть на этой странице:
with open('something.txt', 'r') as f:
for line in f:
if line == '!\n':
next(f,None) # consume next line
continue # skip this line
# ...
Метод file.readlines возвращает список строк, а итерация по списку не позволит вам изменить итерацию в теле цикла. Однако, если вы сначала вызываете iter в списке, вы получите итератор, который вы можете изменить в теле цикла:
lines = open('something.txt', 'r').readlines()
line_iter = iter(lines)
for line in line_iter:
if line == '!':
# force iteration forward twice
line_iter.next()
line_iter.next()
<etc>
Как указывает ebo, сам файл файл действует как итератор, поэтому вы можете получить тот же эффект, не вызывая чтения и не оставляя вызов для iter.
Не очень компактно:
skip = False
for line in open('something.txt'):
if skip:
skip = False
continue
if line.strip() == '!':
skip = True
continue
Вы можете использовать рекурсию
input = iter( open('something.txt') )
def myFunc( item ):
val = iter.next()
if( val == '!' ):
item.next()
return myFunc( item )
#continue on with looping logic
Отредактированный пост содержал следующее, которое на самом деле не отвечало на ваш вопрос:
Вы пробовали
[line for line in open('something.txt') if line != '!']
чтобы создать новый список? Или даже лучше
filter( lambda line: line != '!', open('something.txt') )