我正在阅读一个大文本文件,我需要从特定行读取一个数字。该文件如下所示:
....
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次迭代。那么,我怎样才能使它再推进一次迭代以获得我真正需要的线呢?
答案 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)