我:如何从NCBI批量下载数据?
鸨:找叶老啊!
我:打扰了!
之前在一篇文章中批量从NCBI下载指定物种中指定基因的序列介绍用NCBI
的Batch Entrez
来批量下载序列,那种方法确实很方便,但是那种方法需要我们先通过NCBI网页端下载得到ID
的列表,然后用列表来批量下载序列。如果我只有一个基因,那么这样下载起来还算方便,但是如果我有n个基因然后想下载n个基因在m个不同物种当中的序列,那么用这种方法我起码要先在NCBI中搜索n次,但是我不想搜索n次,我只想一步到位,即利用一个关键词就得到所有我需要的结果。NCBI
除了之前介绍的Batch Entrez
之外,还有另外一个比较好用的api工具Entrez Programming Utilities,这个工具主要依托于perl
,安装方法可参考但是今天我在perl
上面尝试了一下,总是报错,恰好我在Biopython
里面也有这个api的模块,于是干脆用Biopython
。
经过一番研究后,我发现可以这么做:
确认搜索语法
先在NCBI中搜索下,确认下搜索语法,比方说我想在NCBI的nucleotide
数据库中搜索鸟类中的VAPA基因,那么我先在NCBI的搜索框中输入VAPA avian
,然后可以看见在NCBI的右侧有搜索语法显示(VAPA[All Fields] AND ("Aves"[Organism] OR avian[All Fields])) AND biomol_mrna[PROP]
用Esearch
获得符合条件的数据列表
于是我们可以先用Esearch
来搜索得到所有的id列表1
2
3
4
5from Bio import Entrez
Entrez.email = "history.user@example.com" # Always tell NCBI who you are
search_handle = Entrez.esearch(db="nucleotide",term="(VAPA[All Fields] AND (\"Aves\"[Organism] OR avian[All Fields])) AND biomol_mrna[PROP]",usehistory="y", idtype="acc")
search_results = Entrez.read(search_handle)
search_handle.close()
Esearch
的功能是通过特定关键词在数据库中进行检索,返回符合条件的条目的列表。我们需要修改的地方是Entrez.email
, Entrez.esearch里的term
。
利用EFetch
和Esearch
的结果来下载序列
1 | #以下代码来自bioython文档 |
在这里先解释一下,为什么要先通过ESearch
来获得序列的编号列表,然后再通过EFetch
来下载序列呢?首先ESearch
只有搜索关键词并返回结果的id的功能,没有下载的功能,而EFetch
只有根据id
来下载序列的功能没有根据关键词term
来下载序列的功能。ESearch
的主要参数有如下几个
参数 | 功能 | 是否必选? |
---|---|---|
db | 指定数据库 | 是 |
term | 搜索限定词 | 是 |
usehistory | 当设定为y 时,可以通过query_key和WebEnv来再次使用之前的数据 |
否 |
WebEnv | 之前搜索(ESearch/EPost/ ELink)时返回的参数,用于保存之前的搜索结果,跟query_key一起使用 | 否 |
rettype | 返回数据的格式,有uilist(默认)和count | 否 |
retmode | 返回数据的格式,有xml(默认)和json | 否 |
idtype | 返回数据为Accession number(s) | 可选 |
EFetch
主要参数有如下几个
参数 | 功能 | 是否必选? |
---|---|---|
db | 指定数据库 | 是 |
id | 要下载序列的id,在biopython中以列表形式存在 | 是 |
usehistory | 当设定为y 时,可以通过query_key和WebEnv来再次使用之前的数据 |
否 |
WebEnv | 之前搜索(ESearch/EPost/ ELink)时返回的参数,用于保存之前的搜索结果,跟query_key一起使用 | 否 |
retmode | 返回数据的格式,有xml(默认)和text | 否 |
rettype | 返回数据格式,有fasta,uilist等等,参考https://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.EFetch | 否 |
retmax | 每次下载序列的数量,最多为10000,本次设定为3 | 否 |
retstart | 每次下载时要下载的第一条序列对应id在id列表中的下标 | 否 |
运行以上代码后,就可以下载nucleotide数据库中所有鸟类的VAPA
基因的mRNA
序列,我检查了一下,用这个脚本下载下来的序列数量和序列与直接从NCBI网页端下载下来的相同。
另外我根据上面的代码写了一个脚本,现在已经上传到github。