查找行,然后获取下一行

时间:2014-01-08 15:58:20

标签: python python-2.7

我有以下问题: 我打开一个文件并逐行读取,搜索特定的模式。当我找到它时,我想把整行和下两行写成一个新文件。问题是我不知道如何从我发现的线路到下一个2。

AAA
XXX
XXX
BBB
XXX
XXX
CCC
XXX
XXX

在这个例子中,我会找到“BBB”,我想得到接下来的两行。

我该怎么办?非常感谢您的帮助!

编辑:我意识到我必须更准确地询问。

这是我同事的代码

for k in range(0,len(watcrd)):
    if cvt[k]>cvmin:
        intwat+=1
        sumcv+=cvt[k]
        sumtrj+=trj[k]/((i+1)*sep/100)
        endline='%5.2f %5.2f' % (cvt[k],trj[k]/((i+1)*sep/100)) # ivan
        ftrj.write(watline[k][:55]+endline+'\n')
        fall.write(watline[k][:55]+endline+'\n')

对于每个k in range,我想将k, k+1, k+2写入文件ftrj。 哪种方法最好?

编辑2:对不起,但我意识到我犯了一个错误。你的建议有用,但我意识到我必须把它包含在代码的不同部分。

for line in lines[model[i]:model[i+1]]:
    if line.startswith('ATOM'):
    resi=line[22:26]
    resn=line[17:20]
    atn=line[12:16]
    crd=[float(line[31:38]),float(line[38:46]),float(line[46:54])]

    if (resn in noprot)==False and atn.strip().startswith('CA')==True:
        protcrd.append(crd)
    if (resn in reswat)==True and (atn.strip() in atwat)==True:
        watcrd.append(crd)
        watline.append(line)

我会想到这样的事情:

    (...)
    if (resn in reswat)==True and (atn.strip() in atwat)==True:
        watcrd.append(crd)
        watline.append(line)
        for i in range(1, 3):
            try:
                watcrd.append(crd[line + i])
                watline.append(line[line + i])
            except IndexError:
                break

但它不起作用。如何指出要添加到此列表中的部分和行?

1 个答案:

答案 0 :(得分:5)

Python文件对象是迭代器,您可以随时询问下一行:

with open(inputfilename) as infh:
    for line in infh:
        if line.strip() == 'BBB':
            # Get next to lines:
            print next(infh)
            print next(infh)

这里next() functioninfh迭代器推进到下一行,返回该行。

但是,您没有处理文件;你正在处理一个列表;您始终可以访问列表中的后续索引:

    ftrj.write(watline[k][:55]+endline+'\n')
    fall.write(watline[k][:55]+endline+'\n')
    for i in range(1, 3):
        try:
            ftrj.write(watline[k + i][:55]+endline+'\n')
            fall.write(watline[k + i][:55]+endline+'\n')
        except IndexError:
            # we ran out of lines in watline
            break