2013-11-14 3 views
1

Я пытаюсь получить последовательность белка из NCBI через номер идентификатора гена (GI), используя функцию Entrez.fetch() Biopython.Как получить определенную последовательность белка, используя entrez.efetch?

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']. 

Однако, в зависимости от ГИ белка заявляется, XML дерево может отличаться. Это затрудняет автоматизацию этого процесса.

Мой вопрос: Можно ли получить только последовательность белка, а не весь XML-дерево? Или альтернативно: как я могу извлечь последовательность белка из файла XML, учитывая, что структура файлов XML может отличаться от белка к белку?

Благодаря

ответ

1

Хорошей точка, запись базы данных в XML действительно изменяется между белками, представленным различными авторами.

Я сделал алгоритм «охота» для белковых последовательностей из дерева XML:

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

gi   = '1293613'   # example gene id     
Entrez.email= "[email protected]" # 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! 

Примечания: в редких случаях (в зависимости от «ключевого слова фильтра») может юмористический захватить нежелательные строки, такие как имена авторов, начинающиеся с «M», чья сокращенное наименования имеет длину более 10 символов (рисунок ниже):

enter image description here

Надеюсь, что это поможет!