我试图通过基因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文件的结构可能因蛋白质而异?
由于
答案 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”开头的作者名称(如下图所示) ): 强>
希望有所帮助!