生物信息中的Python 05 | 從 Genbank 文件中提取 CDS 等其他特征序列

1 介紹

在基因結構分析或其他生物功能分析中會時常用到 CDS 序列,以及其他諸如 mRNA 序列,misc RNA序列等具有生物意義的序列片段。而NCBI 的基因庫中已經(jīng)包含有這些的信息,但是只有一部分是整理可下載的。而剩下的一部分可以通過 genbank給出的位點信息來提取,個人能力有限,這里只做拋轉之用。下面以提取 CDS 為例,記錄提取序列過程,其他特征序列類似。

2 結構目錄

mark

3 Python代碼

序列自動下載可以通過 Biopython 的 Entrez.efetch 方法來實現(xiàn),這里以本地文件為例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018\9\20 0020 18:32
# @Author  : Baimoc
# @Email   : baimoc@163.com
# @File    : main.py
import os
from Bio import SeqIO


def format_fasta(ana, seq, num):
    """
    格式化文本為 fasta格式
    :param ana: 注釋信息
    :param seq: 序列
    :param num: 序列換行時的字符個數(shù)
    :return: fasta格式文本
    """
    format_seq = ""
    for i, char in enumerate(seq):
        format_seq += char
        if (i + 1) % num == 0:
            format_seq += "\n"
    return ana + format_seq + "\n"


def get_cds(gb_file, f_cds):
    """
    從 genbank 文件中提取 cds 序列及其完整序列
    :param gb_file: genbank文件路徑
    :param f_cds: 是否只獲取一個 CDS 序列
    :return: fasta 格式的 CDS 序列, fasta 格式的完整序列 
    """
    # 提取完整序列并格式為 fasta
    gb_seq = SeqIO.read(gb_file, "genbank")
    complete_seq = str(gb_seq.seq)
    complete_ana = ">" + gb_seq.id + ":" + gb_seq.annotations["accessions"][2] + " " + gb_seq.description + "\n"
    complete_fasta = format_fasta(complete_ana, complete_seq, 70)

    # 提取 CDS 序列并格式為 fasta
    cds_num = 1
    cds_fasta = ""
    for ele in gb_seq.features:
        if ele.type == "CDS":
            cds_seq = ""
            cds_ana = ">lcl|" + gb_seq.id + "_cds_" + ele.qualifiers['protein_id'][0] + "_" + str(cds_num) + " [gene=" + \
                      ele.qualifiers['gene'][0] + "]" + \
                      " [db_xref=" + ele.qualifiers['db_xref'][0] + "]" + " [protein=" + ele.qualifiers['product'][
                          0] + "]" + \
                      " [protein_id=" + ele.qualifiers['protein_id'][0] + "]" + " [gbkey=CDS]\n"
            cds_num += 1
            for ele1 in ele.location.parts:
                cds_seq += complete_seq[ele1.start:ele1.end]
            cds_fasta += format_fasta(cds_ana, cds_seq, 70)
            if (f_cds):
                break
    return cds_fasta, complete_fasta


if __name__ == '__main__':
    # 文件輸出路徑
    cds_file = "out/cds.fasta"
    complete_file = "out/complete.fasta"
    # genbank 文件路徑
    res_dir = "res"
    cds_file_obj = open(cds_file, "w")
    complete_file_obj = open(complete_file, "w")
    for file in os.listdir(res_dir):
        cds_fasta, complete_fasta = get_cds(res_dir + os.sep + file, True)
        cds_file_obj.write(cds_fasta)
        complete_file_obj.write(complete_fasta)

4 其他方法獲取

類型 編號
AY,AP 同一個基因存在多個提交版本時的序列編號
NC,NM NCBI 官方推薦及使用的序列編號
IMAGE等 針對特定物種,或特定組織提供的序列編號
4.1 對于AY,AP,可以用下面的方式來實現(xiàn) CDS 序列下載,但是對于樣本量大的序列分析比較低效
  • 這里的cds是可以點擊的鏈接,點擊
mark
  • 會有詳細信息展示,點擊 fasta 鏈接來下載序列

    mark
4.2 對于NC,NM,可以用下面的方式來實現(xiàn) CDS 序列下載,同樣對于樣本量大的序列分析比較低效
mark
4.3 通過爬蟲實現(xiàn)自動化,但是成本比較高,而且加重 NCBI 服務器負擔,搞不好IP就會被封掉
4.4 用 BioPython 的 Entrez.efetch(db="nuccore", id=ids, rettype="fasta_cds_na ", retmode="text") 方法實現(xiàn)。但是經(jīng)過實際調用,并沒有什么效果。但是可以利用它來下載genbank序列后續(xù)實現(xiàn)自動化提取
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容