如何使用entrez.efetch获得特定的蛋白质序列?

时间:2013-11-14 19:18:06

标签: xml sequence bioinformatics biopython ncbi

我试图通过基因id(GI)编号从NCBI获得蛋白质序列,使用Biopython的Entrez.fetch()函数。

proteina = Entrez.efetch(db="protein", id= gi, rettype="gb", retmode="xml").

然后我使用以下方法阅读数据:

proteinaXML = Entrez.read(proteina).

我可以打印结果,但我不知道如何单独获得蛋白质序列

显示结果后,我可以手动手动 。或者我使用以下方法检查XML树:

proteinaXML[0]["GBSeq_feature-table"][2]["GBFeature_quals"][6]['GBQualifier_value'].

但是,根据提交的蛋白质的GI,XML树可能会有所不同。使得这个过程很难自动化。

我的问题 :是否可以只检索蛋白质序列,而不是整个XML树? 或者:我如何从XML文件中提取蛋白质序列,因为XML文件的结构可能因蛋白质而异?

由于

1 个答案:

答案 0 :(得分:2)

好的一点是,XML中的数据库条目确实因各种作者提交的蛋白质而异。

我已经制作了一个算法来“搜寻”来自XML树的蛋白质序列:

import os
import sys
from Bio import Entrez
from Bio import SeqIO

gi          = '1293613'         # example gene id                   
Entrez.email= "you@email.com"   # Always tell NCBI who you are
protina     = Entrez.efetch(db="protein", id=gi, retmode="xml") # fetch the xml
protinaXML  = Entrez.read(protina)[0]

seqs = []           # store candidate protein seqs
def seqScan(xml):   # recursively collect protein seqs
    if str(type(xml))=="<class 'Bio.Entrez.Parser.ListElement'>":
        for ele in xml:
            seqScan(ele)
    elif str(type(xml))=="<class 'Bio.Entrez.Parser.DictionaryElement'>":
        for key in xml.keys():
            seqScan(xml[key])
    elif str(type(xml))=="<class 'Bio.Entrez.Parser.StringElement'>":
        #   v___THIS IS THE KEYWORD FILTER_____v
        if (xml.startswith('M') and len(xml))>10: # 1) all proteins start with M (methionine)
            seqs.append(xml)                      # 2) filters out authors starting with M

seqScan(protinaXML) # run the recursive sequence collection
print(seqs)         # print the goods!

注意:在极少数情况下(取决于“关键字过滤器”),它可能会幽默地抓取不需要的字符串,例如以缩写名称长度超过10个字符的“M”开头的作者名称(如下图所示) ):

enter image description here

希望有所帮助!