如何使for循环每次跳过2个迭代?

3
我正在阅读一个大型文本文件,需要从特定行读取一个数字。该文件看起来像这样:
....
unknown number of lines
....
ABCD
some random stuff
a number I want to read
....
....

我想读取在“签名”行之后两行的带有唯一标识符“ABCD”的行中的数字。目前我正在做的是:
with open(filename,'r') as f:
  for line in f:
    if line.rstrip('\n') == 'ABCD':
      continue

但是continue只能使for循环前进1次迭代。那么,我该如何使它前进一次迭代以获取我实际需要的行?

显而易见的选择是使用re进行正则表达式匹配。尝试使用re.match(r'\d*', your_text)或类似的方法提取这个数字。 - PatNowak
4个回答

6
你可以明确调用 f* 上的 next 方法(这通常由 for 循环自动完成),推进迭代器,然后调用 continue
for line in f:
    if line.rstrip('\n') == 'ABCD':
        next(f)
        continue
    print(line)

这将会打印出以下内容:
....

unknown number of lines

....

a number I want to read

....

....

因此,跳过'ABCD''some random stuff'

在一般情况下,如果您确定ABCD不是最后一个元素,则不应出现问题。但如果您想保险起见,可以将其包装在try-except中以捕获StopIteration异常。


* 在这种情况下,这是行得通的,因为f是它自己的iterator,即iter(f) is f。一般情况下,对于列表,迭代器是它自己的独立对象list_iterator,因此这样推进它是行不通的。


请注意,这仅适用于f是迭代器的情况。这可能适用于文件,但如果f是一个列表,则执行此操作会导致错误。(当然,您可以通过在循环之前创建一个迭代器并将其分配给变量,然后将其用作循环的对象来解决这个问题。) - jpmc26
@jpmc26 这确实是真的;我会加上这一点,因为其他人碰到这个问题可能会感到困惑。 - Dimitris Fasarakis Hilliard

1
如果您想坚持这种方法,请按照以下步骤操作:
f = open(filename,'r'):
while f.readline().rstrip('\n') != 'ABCD': # this will advanced the pointer to the ABCD line
    continue
f.next() # to skip over the unnecessary stuff
desiredNumber = f.readline()  # desired line

我认为正则表达式会更好,但如果你想要完成工作,这就是它。


0

如果你完全不需要被跳过的那一行的任何信息,你可以在continue之前手动向前移动一行文件:

with open(filename,'r') as f:
    for line in f:
        if line.rstrip('\n') == 'ABCD':
            next(f)     # The next iteration of the for loop will skip a line
            continue

如果你只需要这个文件中的一行,那么根本不需要继续执行continue。只需跳过一行,获取下一行,进行必要的操作,然后从if块中break退出for循环即可。

2
通常最好使用next而不是readline。我不知道Python 3做了什么承诺,但在Python 2上,混合文件迭代和显式的readline是行不通的。 - user2357112

0

我更喜欢@Jim使用next(),但另一个选项是只使用标志:

with open(filename,'r') as f:
  skip_line = False
  for line in f:
    if line.rstrip('\n') == 'ABCD':
      skip_line = True
      continue
  if skip_line == True:
    skip_line = False
  else:
    print(line)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接