生物信息中的Python 04 | 批量下载基因与文献

相信 Entrez 的强大是有目共睹的,BioPython 将它几乎所有操作都封装为方法,使我们可以更加方便的利用这个强悍工具。对于分析比对多个序列文件时的工作量说多了都是泪。比如,老板让你比对自己测定序列与 NCBI 库中序列,并构建相应的进化树,而这个序列需要大于100条。我想你的心情不会和下载一条序列时那么平静,那么,接下来通过BioPython提供的接口来实现快速的自动化序列下载。

一、自动获取氨基酸序列数据

1. 利用 Nucleotide 数据库来查询所有 oct4 基因的序列数据,为了展示基础的流程,这里采用逐条下载的方式
from Bio import Entrez,SeqIO

# 参数设置
Entrez.email = "example@163.com"
Entrez.tool  = "exampleScript"

# 查询 oct4 基因的在 Nucleotide 中的总数
hd_egquery = Entrez.egquery(term="oct4")
read_egquery = Entrez.read(hd_egquery)
total = 0
for ele in read_egquery["eGQueryResult"]:
    if ele["MenuName"] == "Nucleotide":
        total = ele["Count"]

# 得到查询 id 列表
hd_esearch = Entrez.esearch(db="nucleotide", term="oct4", retmax=total)
read_esearch = Entrez.read(hd_esearch)
# 这里我们只取前两个序列
ids = read_esearch["IdList"][:2]

# 用得到的 id 列表去下载每一条 fasta 文件,并合并,以便后续分析使用(比如进化树构建)
hd_efetch_fa = Entrez.efetch(db='nucleotide', id=ids, rettype='fasta')
read_efetch_fa = hd_efetch_fa.read()
with open("res/oct4.fasta","w") as file:
    file.write(read_efetch_fa)
# 同理你可以得到 xml 格式的序列信息
hd_efetch_xml = Entrez.efetch(db="nucleotide", id=ids, retmode="xml")
read_efetch_xml = Entrez.read(hd_efetch_xml)
print(read_efetch_xml)
hd_efetch_gb = Entrez.efetch(db="nuccore", id=ids, rettype="gb", retmode="text")
# 这里读取的是文本文件,保存为本地数据
read_efetch_gb = hd_efetch_gb.read()
with open("res/oct4.gb","w") as file:
    file.write(read_efetch_gb)

# 如果需要提取其中一些信息,可以按照以下步骤, 这里需要注意需要重新得到 efetch 句柄
hd_efetch_gb = Entrez.efetch(db="nuccore", id=ids, rettype="gb", retmode="text")
parse_efetch_gb = SeqIO.parse(hd_efetch_gb, "gb")
# 这里可以保存为 xls 或者 csv 格式
for ele in parse_efetch_gb:
    print(ele.name, ele.annotations['molecule_type'], ele.seq)
1.2 用历史记录特性提高效率

还记得上一篇教程中提到的历史记录吗?

利用这个特性,不仅可以减轻 Entrez 服务器的负载,更可以同时获取多条数据,节省大量时间精力

from Bio import Entrez

# 参数设置
Entrez.email = "example@163.com"
Entrez.tool  = "exampleScript"

hd_search = Entrez.esearch(db="nucleotide", term="oct4", usehistory="y")
read_search = Entrez.read(hd_search)
webenv = read_search["WebEnv"]
query_key = read_search["QueryKey"]

# 使用历史记录特性来进行搜索。
# Entrez 将会提前进行缓冲,提高查询效率
step = 5
total = 10
with open("res/res_env_oct4.fasta", "w") as res_file:
    for start in range(0, total, step):
        end = min(total, start+step)
        print("Download record %i to %i" % (start+1, end))
        hd_fetch = Entrez.efetch(db="nucleotide", rettype="fasta", retmode="text", retstart=start, retmax=step, webenv=webenv, query_key=query_key)
        records = hd_fetch.read()
        res_file.write(records)

二、自动获取参考文献

1. 利用PubMed数据库来查询所有关于小鼠的文献资料,为了展示基础的流程,这里采用逐条下载的方式
from Bio import Entrez
from Bio import Medline

# 参数设置
Entrez.email = "example@163.com"
Entrez.tool  = "exampleScript"

# 用 esearch 在 pubmed 库中搜索关键字为 "mouse" 的文章
# RetMax 这个参数为每次返回的最大个数,因此如果把Count的值赋给RetMax就会获取全部的mouse的文章,这里为实例设置为100
hd_esearch = Entrez.esearch(db="pubmed", term="mouse", RetMax="100")
read_esearch = Entrez.read(hd_esearch)
idlist = read_esearch["IdList"]
print ("Total: ", read_esearch["Count"])
# 用 efetch下载
hd_efetch = Entrez.efetch(db="pubmed", id=idlist, rettype="medline", retmode="text", )
# 用 Medline 来解析
parse_medline = Medline.parse(hd_efetch)
with open("res/mouse_pubmed.xls", "w") as file:
    file.write("title\tauthors\tsource\tPubMed\n")
    for i, ele in enumerate(list(parse_medline)):
        line = ele['TI'] + "\t" + ",".join(ele['AU']) + "\t" + ele['SO'] + "\t" + ele['PMID'] + "\n"
        file.write(line)
        print (i, line)
2. 提高上面脚本的效率,这里我们来查询近一年的关于 Sus scrofa 的综述
from Bio import Entrez
# 参数设置
Entrez.email = "example@163.com"
Entrez.tool  = "exampleScript"

# 搜索
hd_esearch = Entrez.esearch(db="pubmed", term="Sus scrofa", reldate=365, ptyp="Review", usehistory="y")
read_esearch = Entrez.read(hd_esearch)
total = int(read_esearch["Count"])
webenv = read_esearch["WebEnv"]
query_key = read_esearch["QueryKey"]

# 这里演示设定total为 10
total = 10
step = 5
print("Result items: ", total)
with open("res/recent_review_sus_scrofa.txt", "w") as file:
    for start in range(0, total, step):
        print("Download record %i to %i" % (start + 1, int(start+step)))
        hd_efetch = Entrez.efetch(db="pubmed", retstart=start, retmax=step, webenv=webenv, query_key=query_key, rettype="medline", retmode="text")
        file.write(hd_efetch.read())
三、获取物种谱系

NCBI 提供了很多生物相关数据库,用法几乎差不多,可以根据自身研究或者感兴趣的方向自行选择。

下面的例子是利用NCBI中的分类库 Taxonomy 来查询我们人类在分类学中的位置。

# =====查看物种谱系=====
from Bio import Entrez

# 参数设置
Entrez.email = "example@163.com"
Entrez.tool  = "exampleScript"

# 在 Taxonomy 库中搜索 Homo sapiens
hd_esearch = Entrez.esearch(db="Taxonomy", term="Homo sapiens")
read_esearch = Entrez.read(hd_esearch)
id = read_esearch["IdList"][0]
hd_eftech = Entrez.efetch(db="Taxonomy", id=id, retmode="xml")
read_eftech = Entrez.read(hd_eftech)
print(read_eftech[0]["Lineage"])

生物信息中的Python 01 | 从零开始处理基因序列

生物信息中的Python 02 | 用biopython解析序列

生物信息中的Python 03 | 自动化操作NCBI

<think>好的,我现在需要帮助用户解决如何将ENSG基因ID转换为基因名称的问题。首先,我需要回顾用户提供的引用内容,看看是否有相关的工具或方法被提到。 根据引用[1],提到了基因ID转换工具,是菜单栏中的一个功能。这可能指的是DAVID这样的工具,用户可以直接使用这个在线工具进行转换。同时,引用[2]和[3]都提到了使用脚本或编程方法处理GTF文件或注释表格来转换ID,比如用R或者Python脚本。特别是引用[3]提到了一个Python脚本的例子,用户可能对此感兴趣。 接下来,我需要整理出几种不同的方法:在线工具、编程脚本(R/Python)、Bioconductor包。每种方法需要给出具体步骤,并引用对应的参考文献。例如,使用DAVID对应引用[1],R语言处理对应引用[2],Python脚本对应引用[3]。Bioconductor的org.Hs.eg.db包可能不在引用中,但属于常见方法,可以补充。 需要注意用户可能对技术细节不太熟悉,所以步骤要简明清晰。例如,在线工具适合非编程用户,编程方法适合需要批量处理的情况。另外,确保提到的工具和脚本示例正确,比如Python脚本中使用字典来映射ID。 最后,生成相关问题时要围绕用户的需求扩展,比如其他ID转换问题、处理不同物种、批量转换工具推荐等。确保问题主题相关,帮助用户深入理解。 现在需要检查是否有遗漏的方法或错误,确保每个步骤都正确引用,并且语言自然,符合中文回答要求。同时,避免使用Markdown格式,保持口语化的思考过程,但最终回答要结构清晰,符合用户要求的格式。</think>### ENSG基因ID转换为基因名称的方法 #### 1. 使用在线工具(推荐非编程用户) **DAVID基因功能注释工具**: - 访问官网后选择 **基因ID转换(Gene ID Conversion)**[^1] - 输入ENSG基因ID列表(如ENSG00000139618),选择物种为人类 - 提交后会自动匹配Gene Symbol(如BRCA1)和Gene Name - 优点:无需编程基础,适合少量数据 #### 2. 通过GTF文件生成注释表(编程方法) **R语言实现**: ```r # 从GTF提取ENSG基因名称映射关系 library(rtracklayer) gtf <- import("Homo_sapiens.GRCh38.gtf") gene_info <- as.data.frame(gtf[gtf$type == "gene", c("gene_id", "gene_name")]) write.csv(gene_info, "gene_id_mapping.csv") # 生成注释表格[^2] ``` **Python脚本示例**: ```python # 从GTF文件建立字典 id_to_name = {} with open("Homo_sapiens.GRCh38.gtf") as f: for line in f: if line.startswith("#"): continue parts = line.strip().split("\t") if parts[2] != "gene": continue info = dict(x.split(" ") for x in parts[8].replace('";', '"').split('; ')) id_to_name[info["gene_id"].strip('"')] = info["gene_name"].strip('"') # 使用示例 print(id_to_name["ENSG00000139618"]) # 输出BRCA1[^3] ``` #### 3. 使用Bioconductor注释包 ```r # 安装并加载人类基因组注释包 if (!require("org.Hs.eg.db")) BiocManager::install("org.Hs.eg.db") library(org.Hs.eg.db) # 转换ENSG到Gene Symbol ensg_ids <- c("ENSG00000139618", "ENSG00000141510") mapIds(org.Hs.eg.db, keys=ensg_ids, column="SYMBOL", keytype="ENSEMBL") # 输出:BRCA1, TP53 ``` --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白墨石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值