如何用Python下载NCBI序列集并提取源特征列表?
实用工具方案:提取NCBI序列集的源特征列表
我来给你梳理几个靠谱的工具,帮你搞定从NCBI的100条序列集里提取ID、/country、/collection_date特征的需求——不管你偏好命令行、编程还是网页操作,都有对应的解决方案:
1. NCBI Entrez Direct (EDirect) - 官方命令行工具
这是NCBI官方推出的命令行工具集,批量处理序列数据非常高效,适合熟悉终端操作的用户。
操作步骤:
- 先安装EDirect(按照NCBI官方指引配置即可,无需额外复杂依赖)
- 把你的100条序列ID整理成一个文本文件(比如
accessions.txt,每行一个ID) - 运行以下命令,直接提取并输出你要的格式:
# 先打印表头,再批量提取特征 echo -e "ID\t/country\t/collection_date" && cat accessions.txt | efetch -db nuccore -format gb | xtract -pattern GBSeq -element GBSeq_accession-version -block GBFeature -if GBFeature_key -equals source -element GBQualifier_value -filter GBQualifier_name -equals country -filter GBQualifier_name -equals collection_date | awk '{print NR "\t" $1 "\t" $2}'
这个命令会自动下载GenBank格式的序列,然后精准提取source特征里的国家和采集日期,最后按你要的编号格式输出。
2. Biopython - 可编程的自定义方案
如果你有Python基础,用Biopython可以更灵活地处理数据(比如处理缺失字段、自定义输出格式)。
示例脚本:
from Bio import Entrez, SeqIO # 必须填写你的邮箱,NCBI要求用于追踪访问,避免被限制 Entrez.email = "your_email@example.com" # 读取序列ID列表(假设ID存在accessions.txt中) with open("accessions.txt", "r") as f: accessions = [line.strip() for line in f if line.strip()] # 批量获取GenBank格式的序列记录 handle = Entrez.efetch(db="nuccore", id=accessions, rettype="gb", retmode="text") records = SeqIO.parse(handle, "genbank") # 输出结果 print("ID\t/country\t/collection_date") for idx, record in enumerate(records, 1): country = "N/A" collection_date = "N/A" # 遍历特征,找到source类型的字段 for feature in record.features: if feature.type == "source": country = feature.qualifiers.get("country", [country])[0] collection_date = feature.qualifiers.get("collection_date", [collection_date])[0] break print(f"{idx}\t{country}\t{collection_date}")
运行这个脚本后,会自动处理缺失字段(用N/A填充),输出符合你要求的表格格式。
3. Batch Entrez + 文本处理工具 - 网页+轻量脚本方案
如果你不想用命令行或编程,先通过NCBI的网页工具下载序列,再用简单的文本脚本提取特征:
操作步骤:
- 打开NCBI的Batch Entrez工具,粘贴你的100条序列ID,选择数据库(比如
nuccore) - 选择输出格式为GenBank(完整格式),下载合并后的GenBank文件
- 用
awk脚本提取特征(无需编程基础,复制脚本运行即可):
BEGIN { print "ID\t/country\t/collection_date" idx = 1 country = "N/A" date = "N/A" } /LOCUS/ { current_id = $2 } /\/country=/ { gsub(/"/, "", $0) country = substr($0, 11) } /\/collection_date=/ { gsub(/"/, "", $0) date = substr($0, 20) } /ORIGIN/ { print idx "\t" country "\t" date idx++ country = "N/A" date = "N/A" }
把脚本保存为extract_features.awk,然后运行:
awk -f extract_features.awk your_downloaded_genbank.gb
小提示:
- 用EDirect或Biopython时,一定要填写邮箱,NCBI会限制无标识的频繁访问
- 部分序列可能缺失
country或collection_date字段,上述方案都做了缺失值处理,你可以根据需求调整填充内容
内容的提问来源于stack exchange,提问作者Eduardo




