我有以下问题: 我打开一个文件并逐行读取,搜索特定的模式。当我找到它时,我想把整行和下两行写成一个新文件。问题是我不知道如何从我发现的线路到下一个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
但它不起作用。如何指出要添加到此列表中的部分和行?
答案 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()
function将infh
迭代器推进到下一行,返回该行。
但是,您没有处理文件;你正在处理一个列表;您始终可以访问列表中的后续索引:
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