从NCBI等数据库获取序列数据

有两种方法: 1, 使用 Bio::DB::GenBank (使用Web Interface获取序列数据,当需要获取大量数据的时候不建议使用,否则 ip 有可能被 ban) 2, 下载整个 NCBI 数据库到本地,使用 Bio::DB::Flat 对它建立 index。由于这样以后每次的操作都可以在本地进行,所以对大规模的操作来说,这是比较好的方法。

简单的获取序列数据的示例:

use Bio::Perl; 
my $seq = get_sequence('genbank',$acc); #$acc 是 该序列的 accesion number 
print “I got a sequence $seq for $acc\n”;

以下这个例子可以利用 accesion number 获取一个蛋白质的fasta格式序列(或核苷酸序列)并将它输出到STDOUT:

#!/usr/bin/perl -w 
use strict; 
use Bio::DB::GenPept; 
use Bio::DB::GenBank; 
use Bio::SeqIO; 
my $db = new Bio::DB::GenPept(); # my $db = new Bio::DB::GenBank(); 
# if you want NT seqs # use STDOUT to write sequences 
my $out = new Bio::SeqIO(-format => 'fasta'); 
my $acc = 'AB077698'; 
my $seq = $db->get_Seq_by_acc($acc); 
if( $seq ) 
{ $out->write_seq($seq); } 
else { print STDERR "cannot find seq for acc $acc\n"; } 
$out->close();

如果你使用的是第二种方法,并将序列数据库下载到了本地的话,获取一个序列的方法如下:

注意:序列获取使用的是 LWP::Simple 模块,它会自动获取 HTTP_PROXY 环境变量,因此如果需要使用代理,那么设定你的 HTTP_PROXY 即可。

use Bio::DB::Flat; 
my $db = new Bio::DB::Flat(-directory => '/tmp/idx', -dbname => 'swissprot', -write_flag => 1, \
                  -format => 'fasta', -index => 'binarysearch'); 
$db->build_index('/data/protein/swissprot'); 
my $seq = $db->get_Seq_by_acc('BOSS_DROME');

许多时候你并不知道你要的序列的accesion number是多少,而只是想搜索某些序列。比如,你想从 NCBI 中找到所有 Arabidopsis 的拓扑异构酶的序列,可以用一下方法实现:

use Bio::DB::GenBank; 
use Bio::DB::Query::GenBank;  
$query = "Arabidopsis[ORGN] AND topoisomerase[TITL]";
#建立一个 $query_obj 用来进行查询操作
$query_obj = Bio::DB::Query::GenBank->new(-db => 'nucleotide', -query => $query ); 
$gb_obj = Bio::DB::GenBank->new; 
$stream_obj = $gb_obj->get_Stream_by_query($query_obj); 
while ($seq_obj = $stream_obj->next_seq) 
{ # 循环对每个 sequence object 进行一些操作 
  print $seq_obj->display_id, "\t", $seq_obj->length, "\n"; 
}

注意:next_***方法是十分常用的一个方法,在本例中,查询会得到多个结果,使用 next_seq 可以取得下一个 seq,用在 which 循环中用于对每一条查询结果进行操作。

===========================================

#!/usr/local/bin/perl -w
use strict;

use Bio::DB::GenPept;
use Bio::DB::GenBank;
use Bio::SeqIO;

my $db = new Bio::DB::GenPept;
my $out = new Bio::SeqIO(-format => 'fasta');
my $accfile = shift;

open(ACCFILE, $accfile) || die("could not open $accfile");
while(<ACCFILE>) {
chomp;
my $acc = $_;
my $seq = $db->get_Seq_by_acc($acc);
if( $seq ) {
$out->write_seq($seq);
} else {
print STDERR "could not find sequence $acc\n";
}
}

posted @ 2011-04-29 14:38  ACE封印  Views(1325)  Comments(0Edit  收藏  举报