天朝的网速已经不能容忍了。
在此推荐一个新的下载序列的方法:使用 EMBL-EBI 的 dbfetch 工具,它的主页是:http://www.ebi.ac.uk/Tools/dbfetch/emblfetch
你需要提供的信息有:序列的 ID 号、序列所在的数据库、序列的格式、下载的文件类型。注意:前面三个信息不是随意搭配的,EBI 支持的数据库列表参见 http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/dbfetch.databases,每种数据库只能支持特定的 ID 号以及特定的序列格式,别张冠李戴了。
下面我们以获取 NCBI 的 RefSeq 数据库的 DNA 序列为例来说明,相信这个大名你一定不陌生吧?如果你见到有 NC_004952 这样的 ID 号,没错,十有八九就是来自于 RefSeq 数据库的。假设我们要下载的序列的 ID 号是 NC_00495,所对应的数据库名称为 refseq(别拼写错了,要严格按照网页上的说明填写),序列的格式是 genbank (没有找到这种格式?默认的就是genbank),下载的文件类型为raw(即纯文本文件),那么下载的网址是:
http://www.ebi.ac.uk/Tools/dbfetch/dbfetch?db=refseq&id=NC_004952&format=default&style=raw
下载得到的文件名容易被取得乱七八糟,为了整齐起见,我们可以使用 wget 这个命令行工具:
wget "http://www.ebi.ac.uk/Tools/dbfetch/dbfetch?db=refseq&id=NC_004952&format=default&style=raw" -O NC_004952.gbk
亮点在后面加上了一个 -O 参数,可以把下载得到的文件名改成 NC_004952.gbk,这样子是不是漂亮多了呢?注意:网址两侧的引号千万不能省略(省略的后果是什么自己应该清楚)
也就是说,下载序列的网址格式是:
http://www.ebi.ac.uk/Tools/dbfetch/dbfetch?db=数据库名称&id=序列编号&format=序列格式名称&style=文件类型名称
至于批量获取的话,写一个脚本就 OK 了,只需把“序列编号”用某个变量代替掉。没有规定必须要用哪种程序语言来写,你喜欢哪种就用哪种。比如,我用Perl 程序来编写:
# 先自己想办法把序列的 ID 号放在一个数组 @array 里
for my $id (@array) {
# url 地址,把 ID 号换成对应的变量
my $url = qq{"http://www.ebi.ac.uk/Tools/dbfetch/dbfetch?db=refseq&id=$id&style=raw"};
# 调用系统的 wget 命令
system "wget $url -O $id.gbk -a log";
}
这里做了一处比较巧妙的改动:在 wget 后面加了一个 -a 参数,可以把所有的日志都追加到一个日志文件里备查(log 文件),虽然 wget 在运行时出现的那些日志很烦人,但千万别取消它们,这是很好的检查工具。
以下内容于2019/9/9更新
BioPython对efetch工具进一步做了整合,详情参考此博客以及BioPython中文页面。注意需要特别小心rettype的写法!
简单语法如下:
from Bio import Entrez
Entrez.email = '[email protected]'
fetch_handle = Entrez.efetch(db="nucleotide", id=["X55964"], rettype="fasta", retmode="text") # id是列表
data = fetch_handle.read() # 字符串搞定
www perl好方便 wget -O
@Mucid, 哈哈,这是调用系统命令吧,好多语言也应该能够做到
@billzt, C语言是打个括号吧,system(pause) //和windows下的 system(pause) 效果不同
“天朝的网速伤不起”,但那两篇关于bioperl的日志不失为极好的教程,所以还是改回来吧。在日志开头注明:“天朝网速伤不起,友情提示自觉移步到http://bnuzhutao.cn/archives/813“,就更好
@Puriney, 喔喔,我并没有把那两篇删掉,只是用删划线把它们划掉了,在结尾处添加了链接,你可以去看看
这个看不懂 一头雾水 – –
看到你们写的gtkqq的论坛文章看到这个博客的,不过,收藏了。Gtkqq的源码有空研究一下。这个项目还是很有意思的。
@jiechic, 很欢迎啊!
谢谢分享。 dbfetch最多一次200个id吧,如果要下上万条序列,是不是很麻烦. 有更好的办法吗? 😛