问题是这样的:有很多很多序列,几百条,想大致了解一下这些序列分别是什么样的微生物,如果一条一条去blast,那是相当的累。想找一个工具告诉我每条序列blast结果的前几条的名称是什么即可,不需要其它信息。
在网上找了一下,没找到合适的软件或工具,虽然有些关于批量blast的教程之类的,比如这个,但是给出的结果及其繁琐,很多不需要的信息。
后来发现Biopython可以很简单就进行批量Blast。只需先安装Python和Biopython,Python和Biopython的下载地址分别为:
http://www.python.org/download/
http://www.biopython.org/wiki/Download
Windows版本下载后直接双击安装即可,非常简单。
然后打开IDLE(Python GUI),”File”->”New Window”, 分如下两步进行:
第一步,运行下面的代码进行Blast
from Bio.Blast import NCBIWWW
from Bio import SeqIO
import time
SeqNumber = 0
for record in SeqIO.parse("allseq.seq", "fasta"):
SeqNumber += 1
try:
result_handle = NCBIWWW.qblast("blastn", "nr", record.seq)
save_file = open('xml\\'+str(SeqNumber)+'.xml', 'w')
save_file.write(result_handle.read())
save_file.close()
print SeqNumber,' OK!'
except:
print SeqNumber,' Error! Will try again later!'
time.sleep(600)
SeqNumber -=1
print 'Done!'
序列要以fasta格式放在allseq.seq这个文件中,另外需要在当前目录下建一个名字为xml文件夹,代码运行结束后结果放在这个文件夹中。
第二步,列出每条序列blast结果的前几条的名称
from Bio.Blast import NCBIXML
import glob
total_xml_file = len(glob.glob('xml\\*.xml'))
for xmlnumber in range(1,total_xml_file+1):
result_handle = open('xml\\'+str(xmlnumber)+'.xml')
blast_records = NCBIXML.parse(result_handle)
blast_record = blast_records.next()
i = 0
print '-------------------No.', xmlnumber, '-------------------'
for alignment in blast_record.alignments:
if i<10 : ##如果想看前20条结果就该为20
print alignment.title
else:
break
i+=1
result_handle.close()
如果序列比较多,第一步可能需要很长时间,可以趁程序运行的时候先出去踢踢球或逛逛街,回来之后再运行第二步,第二步很快:)
第一次接触使用Python语言,非常好用,个人感觉要比Perl好一些,当然Python的生物信息学组件Biopython的可能现在没有Bioperl强大。
上次做了个序列文件合并小程序,后来发现用Bioedit就可以很简单地进行合并,白忙活了。如果进行批量Blast也有更好的方法,请留言告诉我一下,谢谢 ![]()

I rceokn you are quite dead on with that.