2009-11-05 11 views
3

J'ai ouvert un fichier avec les résultats de l'explosion et j'ai imprimé les résultats au format fasta à l'écran.Enregistrement de la sortie d'une boucle for dans le fichier

Le code ressemble à ceci:

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 

Ceci produit une liste de fichiers FASTA à l'écran. Mais comment puis-je créer un fichier et enregistrer la sortie de fasta dans ce fichier?

Mise à jour: Je suppose que je devrais remplacer les instructions d'impression dans la boucle par quelque chose.write(), mais comment le '>', alignment.title que nous avons écrit?

Répondre

7

Tout d'abord, créez un objet fichier:

f = open("myfile.txt", "w") # Use "a" instead of "w" to append to file 

Vous pouvez imprimer sur un objet fichier:

print >> f, '>', alignment.title 
print >> f, hsp.sbjct 

Ou vous pouvez y écrire:

f.write('> %s\n' % (alignment.title,)) 
f.write('%s\n' % (hsp.sbjct,)) 

Vous pouvez ensuite Fermez-le pour être gentil:

f.close() 
+0

toutes les opérations après l'ouverture du fichier doit être enveloppé avec try ... enfin pour s'assurer que le fichier sera correctement fermé – barbuza

+0

Dans un processus de longue durée, oui, dans un script simple, peu importe que les fichiers seront fermés lorsque le script se termine. – truppo

2

Il existe deux approches générales. En dehors du python:

python your_program.py >output_file.txt 

Ou, à l'intérieur 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() 
4

Quelque chose comme ça

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") 

préfèrent ne pas utiliser print >> que cela ne fonctionnera pas plus dans python3

4

vous pouvez utiliser with statement pour s'assurer que le fichier sera fermé

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)) 

ou utiliser 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() 
0

pour une raison quelconque le code ci-dessus publié par OP ne fonctionnait pas pour moi .. J'ai modifié un peu

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")