Abrí un archivo con resultados asombrosos e imprimí los resultados en formato fasta en la pantalla.
El código se ve así:
result_handle = open("/Users/jonbra/Desktop/my_blast.xml") from Bio.Blast import NCBIXML blast_records = NCBIXML.parse(result_handle) blast_record = blast_records.next() for alignment in blast_record.alignments: for hsp in alignment.hsps: print '>', alignment.title print hsp.sbjct
Esto genera una lista de archivos fasta en la pantalla. Pero, ¿cómo puedo crear un archivo y guardar la salida fasta en este archivo?
Actualización: Supongo que tendría que reemplazar las declaraciones de impresión dentro del bucle con something.write (), pero ¿cómo se escribe ‘>’, align.title?
Primero, crea un objeto de archivo:
f = open("myfile.txt", "w") # Use "a" instead of "w" to append to file
Puede imprimir en un objeto de archivo:
print >> f, '>', alignment.title print >> f, hsp.sbjct
O puedes escribirle:
f.write('> %s\n' % (alignment.title,)) f.write('%s\n' % (hsp.sbjct,))
A continuación, puede cerrarlo para ser agradable:
f.close()
Algo como esto
with open("thefile.txt","w") as f for alignment in blast_record.alignments: for hsp in alignment.hsps: f.write(">%s\n"%alignment.title) f.write(hsp.sbjct+"\n")
Prefiero no usar print >>
ya que no funcionará más en Python3
se puede utilizar with statement
para garantizar que el archivo se cerrará
from __future__ import with_statement with open('/Users/jonbra/Desktop/my_blast.xml', 'w') as outfile: from Bio.Blast import NCBIXML blast_records = NCBIXML.parse(result_handle) blast_record = blast_records.next() for alignment in blast_record.alignments: for hsp in alignment.hsps: outfile.write('>%s\n%s\n' % (alignment.title, hsp.sbjct))
o use try ... finally
outfile = open('/Users/jonbra/Desktop/my_blast.xml', 'w') try: from Bio.Blast import NCBIXML blast_records = NCBIXML.parse(result_handle) blast_record = blast_records.next() for alignment in blast_record.alignments: for hsp in alignment.hsps: outfile.write('>%s\n%s\n' % (alignment.title, hsp.sbjct)) finally: outfile.close()
Hay dos enfoques generales. Fuera de python:
python your_program.py >output_file.txt
O, dentro de Python:
out = open("output_file.txt", "w") for alignment in blast_record.alignments: for hsp in alignment.hsps: print >>out, '>', alignment.title print >>out, hsp.sbjct out.close()
por alguna razón, el código publicado anteriormente por OP no funcionó para mí … modifiqué un poco
from Bio.Blast import NCBIXML f = open('result.txt','w') for record in NCBIXML.parse(open("file.xml")) : for alignment in record.alignments: for hsp in alignment.hsps: f.write(">%s\n"%alignment.title) f.write(hsp.sbjct+"\n")