寻找全长

时间:2014-04-01 09:01:50

标签: python bioinformatics

我有一个像这样的输入文件

         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()

1 个答案:

答案 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变量,因为它似乎未被使用。也许我误解了你的片段?