首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出全长

找出全长
EN

Stack Overflow用户
提问于 2014-04-01 09:01:50
回答 1查看 62关注 0票数 0

我有这样一个输入文件

代码语言:javascript
复制
         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单位,从开始和结束的网站。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-01 09:20:38

如果我正确地理解了您,您的条件可以重写为:|distance_from_start_to_end - stated_length| < 10。

代码语言:javascript
复制
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变量,因为它似乎没有被使用。也许我误解了你的小片段?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22781227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档