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