这可能是一个非常愚蠢的问题,但是我已经在网上看了等等。并且没有看到一个可靠的答案。
有没有一种简单的方法可以做这样的事情?
lines = open('something.txt', 'r').readlines()
for line in lines:
if line == '!':
# force iteration forward twice
line.next().next()
<etc>
在C ++中很容易做到;只需将迭代器增加一个额外的时间。在Python中有一种简单的方法吗?
我只想指出,这个问题的主要目的不是“阅读文件等”和跳过事情。我更喜欢C ++迭代器样式迭代。新标题也有点愚蠢,我真的不认为它反映了我问题的本质。
答案 0 :(得分:33)
尝试:
lines = iter(open('something.txt', 'r'))
for val in lines:
if val == "!":
lines.next()
continue
<etc>
您可能希望在某处抓住StopIteration
。如果迭代器完成就会发生。
答案 1 :(得分:9)
这是短暂的,pythonic,并且有效:
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:
#...
编辑:
许多人观察到,这还不是解决方案。我能想到的最好的结果是本页面已有的内容:
with open('something.txt', 'r') as f:
for line in f:
if line == '!\n':
next(f,None) # consume next line
continue # skip this line
# ...
答案 2 :(得分:7)
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指出的那样,文件对象本身就是一个迭代器,所以你可以通过不调用readlines并省去对iter的调用来获得相同的效果。
答案 3 :(得分:1)
不太紧凑:
skip = False
for line in open('something.txt'):
if skip:
skip = False
continue
if line.strip() == '!':
skip = True
continue
答案 4 :(得分:1)
你可以使用递归
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') )