美文网首页生信数据处理
用python从gbff文件中直接提取cds序列

用python从gbff文件中直接提取cds序列

作者: 生信工具箱 | 来源:发表于2022-04-24 10:51 被阅读0次

    首先,我们要了解一下什么是GBFF文件

    • GenBank纯文本文件格式(GenBank flatfile, 简称GBFF)

    • GBFF是GenBank数据库的基本信息单位

    • GBFF序列文件由单个的序列条目组成。

    • 序列条目由字段组成,每个字段由关键字起始,后面为该 字段的具体说明。

    • 字段分若干次子字段,以次关键字或特性表说明符开始。

    • 每个序列条目以双斜杠“//*作结束标记

    然后看一下每个序列条目所代表的意义

    1、 LOCUS(代码)序列的功能、序列长度、类型、种属来源、录入日期

    2、 DEFINITION(说明)所含的生物学意义的总结性描述

    3、 ACCESSION(编号)具有唯一性和永久性

    4、 VERSION(版本号)检索号、版本号

    5、 KEYWORDS(关键词)描述序列,“ . ”表示没有任何描述内容

    6、 SOURCE(数据来源)序列来源生物的简称,或分子类型
    7、 REFERENCE (文献)与该数据有关的参考文献,按发表时间排名

    8、 FEATURES(特性表)描述基因和基因的产物,以及与序列相关的生物学特性,其中包括
    a. 特性关键词(Feature key) 简要说明功能组的关键词
    b. 特性位置(Location) 指明在特性表中的什么地方找到相关特性
    c. 限定词(Qualifiers) 相关特性的辅助信息

    9、 ORIGIN(碱基排列顺序)类似于FASTA格式给出了所记录的序列

    最后直接上代🐎,更改输入和输出文件即可使用

    
    import re
    
    FILE_PATH = './input.gb'
    OUT_FILE_PATH = './output.fasta'
    
    d = {}
    g = {}
    tem = []
    
    def con_spl(list_,n = 2):
        return [list_[i:i + n] for i in range(0, len(list_), n)]
    
    with open (FILE_PATH,'r')as f:
        
        while True:
    
            text_line = f.readline().strip('\t').split()
    
            if text_line:
    
                if text_line[0] == 'DEFINITION':
    
                    c = ' '.join(i for i in text_line[2:])
                    d[c] = []
                    g[c] = []
    
                    print (text_line)
    
                elif text_line[0] == 'CDS':
    
                    cds = re.findall(r"\d+\d*?",text_line[1])
                    if len(cds) == 2:
                        d[c].append(cds)
    
                    else:
                        for i in con_spl(cds):
                            d[c].append(i)
    
                elif text_line[0] == 'ORIGIN':
    
                    while text_line[0] != '//':
    
                        for i in text_line[1:]:
                            tem.append(i)
    
                        text_line = f.readline().strip('\t').split()
                    
                    e = ''.join(i for i in tem)
                    g[c].append(e)
    
                else:
                    pass
    
            elif f.readline().strip('\t').split():
    
                continue
    
            else:
                break
    
    with open (OUT_FILE_PATH,'w')as f:
        for i,o in d.items():
            G = ''.join(g[I])
            p = ''
            for u in o:
                u1 = int(u[0])
                u2 = int(u[1])+1
                p += G[u1:u2]
            print ('>',i,sep='',file=f)
            print (p,file=f)
    
    

    如果有用请不要忘记点赞加关注,期待你的留言

    相关文章

      网友评论

        本文标题:用python从gbff文件中直接提取cds序列

        本文链接:https://www.haomeiwen.com/subject/johtyrtx.html