如何通过2次迭代推进for循环?

时间:2016-07-19 17:06:37

标签: python python-3.x for-loop file-io

我正在阅读一个大文本文件,我需要从特定行读取一个数字。该文件如下所示:

....
unknown number of lines
....
ABCD
some random stuff
a number I want to read
....
....

我想读取ABCD的“签名”行之后2行的数字,这是唯一的。现在我正在做的是:

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

continue仅使for循环前进了1次迭代。那么,我怎样才能使它再推进一次迭代以获得我真正需要的线呢?

4 个答案:

答案 0 :(得分:5)

您可以在next * (for循环通常为您执行)上显式调用f并推进迭代器,然后调用continue:< / p>

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,因此像这样推进它是行不通的。

答案 1 :(得分: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

我认为正则表达式看起来要好得多,但如果你想要完成工作,那么就是这样。

答案 2 :(得分: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。只需跳过一行,抓住下一行,执行您需要执行的任何操作,并break循环中的for全部来自if块。

答案 3 :(得分: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)