如何使用Biopython Entrez efetch从gene数据库获取人类基因Genbank文件
解决方法
完全不用手动拆分注释文本,Biopython内置的结构化解析工具就能直接拿到坐标,还能自动解析Genbank文件的注释、CDS、外显子内含子结构信息,优化后的代码如下:
from Bio import Entrez from Bio import SeqIO # 配置Entrez邮箱 Entrez.email = "myemail@gmail.com" # 搜索人类P53基因,retmax设为1直接拿最匹配的结果 search_handle = Entrez.esearch(db="gene", retmax=1, term="P53 AND Homo sapiens[organism]") search_record = Entrez.read(search_handle) gene_id = search_record["IdList"][0] # 以XML格式获取基因结构化信息,无需手动拆分文本 gene_fetch_handle = Entrez.efetch(db="gene", id=gene_id, rettype="gb", retmode="xml") gene_record = Entrez.read(gene_fetch_handle)[0] # 直接提取染色体编号、起始、终止坐标 chrom_accession = gene_record['Entrezgene_locus'][0]['Gene-commentary_accession'] start = gene_record['Entrezgene_locus'][0]['Gene-commentary_seqs'][0]['Seq-loc_int']['Seq-interval']['Seq-interval_from'] end = gene_record['Entrezgene_locus'][0]['Gene-commentary_seqs'][0]['Seq-loc_int']['Seq-interval']['Seq-interval_to'] # NCBI返回的起始坐标为0-based,转为和注释一致的1-based start = str(int(start) + 1) end = str(end) # 直接获取带完整注释的Genbank记录,用SeqIO直接解析 gb_handle = Entrez.efetch(db="nuccore", id=chrom_accession, start=start, end=end, rettype="gbwithparts", retmode="text") gb_record = SeqIO.read(gb_handle, "genbank") # 可直接提取所需信息 print(f"染色体编号: {chrom_accession}") print(f"基因起始位点: {start}") print(f"基因终止位点: {end}") print(f"序列长度: {len(gb_record)}") # 遍历特征即可获取CDS、外显子、内含子信息 for feature in gb_record.features: if feature.type == "CDS": print("CDS坐标:", feature.location) if feature.type == "exon": print("外显子坐标:", feature.location)
代码说明
- 直接用
xml格式读取gene库的返回结果,不会因为NCBI调整注释行顺序出现解析错误,稳定性远高于手动拆分文本 - 调用
efetch获取核酸序列时指定rettype="gbwithparts",即可拿到带完整CDS、内含子、外显子注释的Genbank格式数据 - 用
SeqIO.read直接解析返回的句柄,所有注释信息都结构化存储在gb_record.features中,直接遍历提取即可
内容的提问来源于stack exchange,提问作者harijay
相关产品推荐
相关产品推荐

