初品BioPerl(第六篇:从远程数据库下载序列之二)

十二月 12, 2010

假设我们现在要下载两条Genbank格式的序列,它们的编号分别是AC013798和AC021953,你也许会试着这么写:

@seq_obj = $db_obj -> get_Seq_by_acc('AC013798','AC021953'); 

      想法不错,但其实不应该这么写,因为getSeqbyacc这个方法只能接受一个参数。如果你想在括号里塞进去好几个序列的编号,就应该使用getStreambyacc这个方法:

$all_seq_obj = $db_obj-> get_Stream_by_acc(['AC013798', 'AC021953']); 

      getStreambyacc这个方法返回来的并不是两个$seqobj对象,而是一个对象而已,我把它取名为$allseqobj,它里面已经包含了两个序列的信息,怎么把它们一个一个地取出来呢?可以使用类似于SeqIO对象的next_seq方法:

while($seq_obj = $all_seq_obj -> next_seq)
{
    $filename = $seq_obj -> accession;
    $output_seq = Bio::SeqIO -> new(-file => ">$filename.gbk", -format => 'genbank');
    $output_seq -> write_seq($seq_obj);    # 还是一样,以序列的accession编号作为文件名,然后以序列格式(gbk)为扩展名
} 

      也就是说,如果想要批量下载序列,我们只需拿到它们的编号(当然编号的类型要统一起来,比如都使用accession号码或都使用gi号码),就可以将这些编号作为参数传给getStreamby_acc这个方法就行了。
      不得不说,这个程序是很费时间的,我在自己的PC上运行耗时3分21秒。如果使用PC去下载几百条序列(而网络又不通畅的话),很可能下载一半就终止了。你最好是能把这样的程序提交到性能比较稳定的服务器上运行。

 

由于目前网速问题,不推荐此做法,建议采用新的方法:dbfetch

posted in Perl by billzt

Follow comments via the RSS Feed | Leave a comment | Trackback URL

说点什么

您将是第一位评论人!

提醒
wpDiscuz
 

Copyright © 2010-2017 | Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org