问题描述
我有一个文本文件,我想在其中找到关键字后才开始执行任务。但是我要搜索的关键字在文件中出现了两次。我只想为第二个关键字之后的文本执行任务。
我可以获得第二次出现所需关键字的行,但是我如何将其传递给 for 循环并执行我的任务。
我正在寻找类似的东西:
with open(r"myfile.txt") as openfile:
for line in (line_number,openfile):
#Do my task to the line
其中 line_number 是我第二次找到关键字的编号
解决方法
您可以使用简单的标志计数来确定第二次找到关键字:
keyword = 'A'
with open('test.txt') as fp:
c,flag = 0,0
while True:
line = fp.readline()
if not line:
break
c += 1
print("Line {}: {}".format(c,line.strip()))
if keyword in line:
flag += 1
if keyword in line and flag == 2:
print('do some tasks')
输出
Line 1: C E
Line 2: A F
Line 3: E
Line 4: C D
Line 5: A B
do some tasks
Line 6: 1 C E
更好的方法(相同的输出)是使用 enumerate
:
keyword = 'A'
with open('test.txt') as fp:
flag = 0
for c,line in enumerate(fp):
print("Line {}: {}".format(c+1,line.strip())) #remove whitespace characters like `\n` at the end of each line
if keyword in line:
flag += 1
if keyword in line and flag == 2:
print('do some tasks')
,
如果您只想处理关键字第二次出现的行之后的行,则不应查找行号。相反,您可以将文件对象视为迭代器,并使用生成器表达式过滤包含关键字的行,并使用 itertools.islice
使用直到第二次出现关键字的行。
例如,下面的代码会跳过行,直到第二次出现关键字 begin
:
from itertools import islice
keyword='begin'
with open('myfile.txt') as openfile:
list(islice((line for line in openfile if keyword in line),2))
for line in openfile:
print(line,end='')
所以给定myfile.txt
的内容:
header
begin
second header
begin
foo
bar
上面的代码会输出:
foo
bar