2016-04-15 20 views
1

Ich versuche, XML-Datei zu analysieren, die multifasta BLAST Ergebnis enthält - hier ist die link - es ist etwa 400kB groß. Das Programm sollte vier Sequenznamen zurückgeben. Jedes nächstes Ergebnis soll erst nach seiner (enthält die beste Ausrichtung) "< Iteration_iter-num> n < Iteration_iter-num />", wobei n = 1,2,3, ...Parsing Xml-Datei in Python, die Multifasta enthält BLAST Ergebnis

So:

< Iteration_iter-num >1< /Iteration_iter-num > 

****Alignment**** 
sequence: gi|171864|gb|AAC04946.1| Yal011wp [Saccharomyces cerevisiae] 

< Iteration_iter-num >2< /Iteration_iter-num > 

****Alignment**** 
sequence: gi|330443384|ref|NP_009392.2| 

< Iteration_iter-num >3< /Iteration_iter-num > 

****Alignment**** 
sequence: gi|6319310|ref|NP_009393.1| 

< Iteration_iter-num >4< /Iteration_iter-num > 

****Alignment**** 
sequence: gi|6319312|ref|NP_009395.1| 

Aber in Folge meines Programm gibt diese:

<Iteration_iter-num>1</Iteration_iter-num> 
****Alignment**** 
sequence: gi|171864|gb|AAC04946.1| Yal011wp [Saccharomyces cerevisiae] 

<Iteration_iter-num>2</Iteration_iter-num> 
****Alignment**** 
sequence: gi|171864|gb|AAC04946.1| Yal011wp [Saccharomyces cerevisiae] 

<Iteration_iter-num>3</Iteration_iter-num> 
****Alignment**** 
sequence: gi|171864|gb|AAC04946.1| Yal011wp [Saccharomyces cerevisiae] 

<Iteration_iter-num>4</Iteration_iter-num> 
****Alignment**** 
sequence: gi|171864|gb|AAC04946.1| Yal011wp [Saccharomyces cerevisiae] 

Wie ein anderes BLASTA Ergebnis aus dieser xML-Datei zu bekommen?

Hier ist mein Code:

from Bio.Blast import NCBIXML 
from bs4 import BeautifulSoup 

result = open ("BLAST_left.xml", "r") 
records = NCBIXML.parse(result) 
item = next(records) 

file = open("BLAST_left.xml") 
page = file.read() 
soup = BeautifulSoup(page, "xml") 
num_xml_array = soup.find_all('Iteration_iter-num') 
i = 0 
for records in records: 
    for itemm in num_xml_array: 
     print (itemm) 
     for alignment in item.alignments: 
      for hsp in alignment.hsps: 
       print("\n\n****Alignment****") 
       print("sequence:", alignment.title) 
      break 
     itemm = num_xml_array[i+1] 
    break 

// Ich weiß, mein Englisch ist nicht perfekt, aber ich weiß nicht, was wirklich zu tun, und ich habe keine Person, danach zu fragen, so hatte ich Sie :) gewählt

Antwort

1

ich denke biopython eine bessere Option ist da, um den XML zu analysieren, keine neet BeautifulSoup zu verwenden:

from Bio.Blast import NCBIXML 


result = open("BLAST_left.xml", "r") 
records = NCBIXML.parse(result) 

for i, record in enumerate(records): 
    for align in record.alignments: 
     print("Iteration {}".format(i)) 
     print(align.hit_id) 
     break # Breaking here gives you only the best HSP. 
0

Sie python-Modul xml.etree.ElementTree in-build verwenden das XML zu analysieren

import xml.etree.ElementTree as ET 
tree = ET.parse('BLAST_left.xml') 
doc = tree.getroot() 
for item in doc.find('BlastOutput_iterations'): 
    print '< Iteration_iter-num >{0}< /Iteration_iter-num >'.format(item.find('Iteration_iter-num').text) 
    print '** ** Alignment ** **' 
    print 'sequence:{0}|{1}'.format(item.find('Iteration_hits/Hit/Hit_id').text, item.find('Iteration_hits/Hit/Hit_def').text)