Python 寻找完整长度

Python 寻找完整长度,python,bioinformatics,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 对于每个con,我都有p(蛋白质)。我想找到全长的蛋白质,如果我知道起始点,结束点和每个P的长度,这是可能的。下面的脚本就是这样做的。然而,现在我的问题是,我想找出长度,但也要考虑+-10个单

我有一个这样的输入文件

         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
对于每个con,我都有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()

如果我理解正确,您的条件可以改写为:|从|开始|到|结束的距离|规定的|长度|<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)
以open('example.txt',r')作为填充\
打开('output.txt','w')作为输出文件\
以错误文件的形式打开('errors.txt','w'):
对于文件中的行:
id_per,s_start,s_end,s_len=(line.split()[i]表示[2,3,4,5]中的i)
开始到结束=(int(s_结束)-int(s_开始))+1
如果abs(内部(s长度)-开始到结束)<10:
输出文件。写入(行)
其他:
errfile.write(行)
与原始代码相比,此代码段还有其他改进:

  • 与上下文管理器一起使用
    ,以避免显式关闭文件句柄
  • 您不需要使用
    re
    模块,
    split
    可以接受制表器作为要拆分的字符
  • 使用元组运算符
    ,自动解构从行中拆分的标记
  • 通过将字段设置为
    \uuu
  • 删除了
    新列表
    变量,因为它似乎未被使用。也许我误解了你的片段

请在dataOP的
split
中添加一些关于列的说明,该选项卡也处理多个选项卡。您的不会(这将导致空字符串元素)。因此,这是一个值得怀疑的改进。简单地使用
line.split()
?OP版本在
split
之后使用索引,以防行中的元素比预期的多。你使用自动解包的版本没有。@Alfe:OP给出了一个输入示例。没有要求处理多个制表符或可变数量的字段。@阿尔夫:改进了代码段,使其使用
split
,不带分隔符和显式索引。