我有一个像这样的输入文件
id_per start end s_len
con1 P1 95.27 1 148 148
con2 P2 89.86 4 148 148
con3 P5 76.67 1 512 516
每个人都有P(蛋白质)。我想找到全长的蛋白质,如果我知道起始位点,终点和每个P的长度,就有可能。下面的脚本执行此操作。然而,现在我的问题是,我想找到长度,但也要考虑+ - 10个单位,从开始和结束网站。
import re
output=open('res.txt','w')
output2=open('res2.txt','w')
f=open('file.txt','r')
lines=f.readlines()
for line in lines:
new_list=re.split(r'\t+',line.strip())
id_per=float(new_list[2])
s_start=int(new_list[3])
s_end=int(new_list[4])
s_len=int(new_list[5])
if s_start == 1 and s_end == s_len and id_per >= 30:
new_list.append(s_start)
new_list.append(s_end)
new_list.append(s_len)
new_list.append(id_per)
output.writelines(line)
else:
output2.write(line)
f.close()
output.close()
output2.close()
答案 0 :(得分:1)
如果我理解正确,您的情况可以改写为:| distance_from_start_to_end - stated_length | < 10.以下是如何在Python中表达这一点:
with open('example.txt', 'r') as infile, \
open('output.txt', 'w') as outfile, \
open('errors.txt', 'w') as errfile:
for line in in file:
id_per, s_start, s_end, s_len = (line.split()[i] for i in [2, 3, 4, 5])
start_to_end = (int(s_end) - int(s_start)) + 1
if abs(int(s_len) - start_to_end) < 10:
outfile.write(line)
else:
errfile.write(line)
此代码段中有关于原始代码的其他改进:
with
,一个上下文管理器,以避免必须明确关闭文件句柄re
模块,split
可以接受制表符作为要拆分的字符。,
自动解构从行分割的标记_
new_list
变量,因为它似乎未被使用。也许我误解了你的片段?