• 今天花了挺久时间写的一个序列提取的小程序,运行成功了,但可能在效率和实现方面存在不足,以后再改进,并希望大佬们提供宝贵的指导意见以及思路

准备文件

1.存放基因id号的txt文件
2.某物种的全部蛋白序列

biopython 提取序列 根据id python 基因序列提取_python

生成文件

生成所需基因的序列文件

biopython 提取序列 根据id python 基因序列提取_文件名_02

代码实现一

实现思路:

1.将所需要的基因ID存放于列表中,gene_list
2.将全部序列的fasta文件按行存放于列表中,all_seq_list
3.获取对应基因的序列在all_seq_list列表中的索引值(start和end),并存放于列表中,seq_need_index
4.根据索引值,将需要基因的序列提取出来存放于列表中,seq_need_list
5.将seq_need_list的内容写入新文件中

###需要两个初始文件:指定id号的txt文件;序列fasta文件
###需要创建一个存储需要id序列的新文件
def extract_seq(geneid,allseq,seq_need):
    geneid_list = []
    #将基因id存放在列表中
    with open(geneid,'r') as f1:
        for each in f1:
            each = '>' + each
            geneid_list.append(each)
    #print(geneid_list)
    
    ###将全部序列存放于列表中
    all_seq_list = []
    with open(allseq,'r') as f2:
        for eachline in f2:
            all_seq_list.append(eachline)
    
    ###获取对应id序列在all_seq_list的索引值
    seq_need_index = []
    for each in geneid_list:
        start_index = all_seq_list.index(each)
        seq_need_index.append(start_index)
        for i in all_seq_list[start_index + 1:]:
            if '>' in i:
                end_index = all_seq_list.index(i)
                seq_need_index.append(end_index)
                break
    #print(seq_need_index)

    ###根据索引信息存放于列表中
    seq_need_list = []
    for n in range(0,len(seq_need_index),2):
        sindex = seq_need_index[n]
        eindex = seq_need_index[n+1]
        for m in range(sindex,eindex):
            seq_need_list.append(all_seq_list[m])
    #print(seq_need_list)


    ###将所需要的序列写入新文件中
    with open(seq_need,'w') as f3:
        for a in seq_need_list:
            f3.writelines(a)
        
              
geneid = input('请输入所需ID的文件名:')
allseq = input('请输入序列信息的文件名:')
seq_need = input('请输入生成文件的文件名:')
extract_seq(geneid,allseq,seq_need)

代码实现二-来自梁院士优化版改进

实现思路-无需获取索引值

1.将所需要的基因ID存放于列表中,gene_list
2.将全部序列的fasta文件按行存放于字典中seq_dict,若每行开头为‘>’,则为键,其余每行自动添加到对应键的值中

代码实现

###需要两个初始文件:指定id号的txt文件;序列fasta文件
###需要创建一个存储需要id序列的新文件
def extract_seq(geneid,allseq,seq_need):
    #将基因id存放在列表中
    with open(geneid,'rt') as f1:
        geneid_list=f1.read().strip("\n").split("\n")#俩种方法的前后顺序不能反,因为split()后返回列表
    #print(geneid_list)

    ###将全部序列和id存放于字典中
    seqdict={}
    allidlist = []
    with open(allseq,'rt') as infile:
        for line in infile:
            if line[0]=='>':
                key=line.strip()
                seqdict[key]=''
                allidlist.append(line[1:].strip())
            elif len(line.strip())>0:
                seqdict[key]+=line#若为line.strip(),最后序列没有换行符为1行


    ###获取需要的序列bing写入新文件中,注释掉的部分没有按照基因顺序提取
    #with open(seq_need,'wt') as f3:
        #for seqname in seqdict:
            #if seqname in geneid_list:
                #f3.write(f"{seqname}\n{seqdict[seqname]}\n")

    with open(seq_need,'wt') as outfile:
        for eachid in geneid_list:
            if eachid in allidlist:
                outfile.write(f'>{eachid}\n{seqdict[">"+eachid]}')
        
              
geneid = input('请输入所需ID的文件名:')
allseq = input('请输入序列信息的文件名:')
seq_need = input('请输入生成文件的文件名:')
extract_seq(geneid,allseq,seq_need)