Bioperl:获取序列数据

转自:PerlChina.org

有两种方法: 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 = Bio::DB::Query::GenBank->new(-db => 'nucleotide',
-query => $query );
#建立了一个 $query_obj 用来进行查询操作

$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 循环中用于对每一条查询结果进行操作

1 回复
  1. dangmh says:

    把NCBI整个nr数据库下载到本地后 如何用bioperl 从里面提取数据呢 那几种方法我试了 貌似都不行啊

评论已关闭。