ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

生物信息入门:常用数据库与数据格式解析及避坑指南

生物信息入门:常用数据库与数据格式解析及避坑指南

简介:这份课件面向生物信息学入门学习者、生命科学专业学生及需要快速梳理数据资源的科研人员,系统讲解常用生物数据库与数据格式的核心知识。内容围绕NCBI、EBI、DDBJ三大序列数据库,Gene Ontology、KEGG、Interpro等基因功能数据库,以及UCSC、Ensembl基因组数据库展开,并逐一解析FASTA、FASTQ、GenBank、EMBL、GFF等常见格式的结构特点与适用场景,帮助读者解决数据来源分散、格式混淆、检索效率低等问题。资源包内含1个pptx文件,整体约9.49MB,以幻灯片形式呈现,便于课堂讲授与自学查阅。课件曾获公开课奖项,内容组织清晰,从数据库背景到格式实例层层递进,并附有GenBank记录结构等具体示例,可帮助读者建立完整的数据资源认知框架,提升实际检索与格式识别能力。目前已有89人学习关注。

1. 一份课件为什么值得当成工程手册来读

生物信息入门最反直觉的一点是:真正卡住新人的往往不是算法,而是「数据到底长什么样」。你拿到一个差异表达基因列表,想做个富集分析,结果发现基因 ID 是 Ensembl 的,注释文件里全是 Entrez 的,通路数据库又只认 UniProt 的——三个数据库、三套命名、一个都对不上。这种时候,一份把「常用生物数据库和数据格式」讲透的课件,价值不亚于一本工具书。

这份公开课获奖课件的定位就在这里:它不教你写代码,但它把 NCBI、Ensembl、UniProt、KEGG、GO 这些高频数据库的定位、检索入口、批量下载方式,以及 FASTA、FASTQ、GFF/GTF、BED、VCF、SAM/BAM 这些格式的字段含义和转换关系,系统性地串了一遍。适合谁?适合刚进实验室要处理测序数据的研究生,也适合从其他领域转过来、被各种文件后缀搞晕的开发者。下面我按「先搞清数据库怎么选、再搞清格式怎么转、最后搞清坑在哪」的顺序,把这份课件里的核心内容拆成能直接上手的操作。

2. 常用生物数据库:从检索到批量下载的完整路径

2.1 五大核心数据库各自解决什么问题

选数据库的第一步不是打开网页,而是先问自己「我要的是序列、注释、结构还是通路」。这四类需求对应完全不同的库,混用会浪费大量时间。

NCBI 是综合性入口,GenBank 存核酸序列,RefSeq 提供经过审核的参考序列,SRA 存原始测序读段。它的优势是覆盖面广,缺点是同一基因可能有几十条冗余记录,直接拿 GenBank 序列做分析容易踩到「版本不一致」的坑。Ensembl 主打基因组注释,它的 GTF 文件是很多 RNA-seq 流程的默认输入,基因 ID 以 ENSG 开头,转录本以 ENST 开头,版本号用点号分隔。UniProt 是蛋白序列和功能注释的权威库,分为 Swiss-Prot(人工审核)和 TrEMBL(自动注释)两部分,做蛋白结构预测时优先用 Swiss-Prot。KEGG 和 GO 是功能富集的两大支柱,KEGG 偏通路,GO 偏本体论三层结构(分子功能、生物过程、细胞组分)。

提示:新手最容易犯的错是拿 RefSeq 的 NM_ 编号去 KEGG 里搜,搜不到就以为基因不存在。KEGG 用的是 Entrez Gene ID 或 UniProt ID,需要先做 ID 映射。

2.2 用命令行批量下载而不是逐个点网页

课件里演示了网页检索,但实际项目中你不可能手动下载几百个基因。常见做法是用 NCBI 的 E-utilities 或 Ensembl 的 REST API。下面这段 Python 用 requests 调 Ensembl REST 拿一个基因的序列和注释信息,适合做小批量测试。

import requests # Ensembl REST 基础地址,注意版本号写在路径里 server = "https://rest.ensembl.org" # 以某个虚构基因 ID 为例,实际使用时替换成你的目标 ID gene_id = "ENSG00000139618" # 查基因基本信息,返回 JSON ext = f"/lookup/id/{gene_id}?expand=1" r = requests.get(server + ext, headers={"Content-Type": "application/json"}) if not r.ok: r.raise_for_status() gene_info = r.json() print(gene_info["display_name"], gene_info["seq_region_name"], gene_info["start"], gene_info["end"]) # 拿 cDNA 序列,返回纯文本 FASTA ext_seq = f"/sequence/id/{gene_id}?type=cdna" r_seq = requests.get(server + ext_seq, headers={"Content-Type": "text/x-fasta"}) with open(f"{gene_id}.cdna.fa", "w") as f: f.write(r_seq.text)

逻辑说明:第一段请求用expand=1让返回结果包含转录本列表,方便后续遍历。第二段请求的type参数可选genomic、cdna、cds、protein,做表达分析通常用 cdna,做蛋白分析用 protein。参数上要注意seq_region_name是染色体编号,start和end是 1-based 坐标,和 BED 格式的 0-based 半开区间不同,转换时容易差一位。

2.3 数据库版本与坐标系的对应关系

课件里有一页专门讲「为什么你的注释文件和参考基因组对不上」。核心原因是不同数据库的版本更新节奏不同。Ensembl 每几个月发一版,NCBI 的 RefSeq 更新更频繁,而很多论文里用的 GTF 是两三年前的版本。如果你用 GRCh38 的基因组配 GRCh37 的 GTF,基因坐标会整体偏移,富集结果全是错的。

数据库常用版本标识坐标起点区间含义
EnsemblRelease 1101-based闭区间
NCBI RefSeqGCF_000001405.401-based闭区间
UCSChg380-based半开区间
GFF3 规范无版本1-based闭区间
BED 规范无版本0-based半开区间

这张表建议贴在工位上。实际转换时,GFF 转 BED 要把 start 减 1,BED 转 GFF 要把 start 加 1,end 不变。很多转换脚本出错就出在这一步。

3. 数据格式解析:FASTA、GFF、VCF 的字段与转换

3.1 FASTA 与 FASTQ:不只是有没有质量值

FASTA 和 FASTQ 的区别表面上是 FASTQ 多了质量值,但实际处理时差异远不止于此。FASTA 的 header 行以>开头,后面跟序列 ID 和描述,很多工具只取第一个空格前的部分作为 ID。FASTQ 以@开头,第二行是序列,第三行以+开头,第四行是 ASCII 编码的质量值。

# 查看 FASTQ 前 4 条记录,确认格式是否正确 head -n 16 sample.fastq # 用 seqkit 统计基本信息,比手写脚本快 seqkit stats sample.fastq # FASTA 转 FASTQ 需要补质量值,通常用固定值或从其他文件合并 # 这里演示用 awk 给 FASTA 补一个固定质量值(仅用于测试) awk '/^>/{print; getline seq; print seq; print "+"; gsub(/./,"I",seq); print seq}' input.fa > output.fq

逻辑说明:seqkit stats会输出序列条数、总长度、平均长度、GC 含量等,是快速质检的首选。awk 那段是应急用的,gsub(/./,"I",seq)把序列里每个字符替换成I,对应 Phred 质量值 40,实际项目中不要这么干,质量值必须来自真实测序结果。参数上注意 FASTQ 的质量编码有 Phred+33 和 Phred+64 两种,老数据可能是后者,用seqkit stats看不出来,需要用fastqc或seqkit fx2tab检查质量值范围。

3.2 GFF/GTF 的九列字段逐列拆解

GFF 和 GTF 都是九列制表符分隔,前八列含义相同,第九列不同。GFF 的第九列是key=value键值对,GTF 是key "value"形式。很多工具只认其中一种,比如featureCounts默认读 GTF,bedtools更习惯 GFF。

列号字段名含义常见取值
1seqid染色体或 scaffoldchr1, NC_000001.11
2source注释来源ensembl, havana
3type特征类型gene, mRNA, exon, CDS
4start起始坐标(1-based)整数
5end终止坐标(1-based)整数
6score置信度分数通常为 .
7strand链方向+, -, .
8phaseCDS 相位0, 1, 2
9attributes属性列表gene_id "xxx";

第九列的解析是转换脚本最容易翻车的地方。GTF 里一个基因可能有多个转录本,每个转录本有多个外显子,属性里用gene_id和transcript_id关联。如果你只按gene_id去重,会丢掉转录本层面的信息。

3.3 VCF 的 INFO 与 FORMAT 字段怎么读

VCF 是变异检测的标准输出,前八列是固定字段,第九列 INFO 存变异位点的整体信息,第十列之后是每个样本的 FORMAT 和基因型。课件里用一张图展示了DP、AF、GT这些标签的含义,但实际读文件时经常遇到自定义标签。

import pysam # 用 pysam 读 VCF,比手动 split 靠谱 vcf = pysam.VariantFile("sample.vcf.gz") for record in vcf: # record.info 是字典,record.samples 是样本字典 chrom = record.chrom pos = record.pos ref = record.ref alts = record.alts # 取第一个样本的基因型 sample = list(record.samples.values())[0] gt = sample["GT"] dp = sample.get("DP", "NA") print(chrom, pos, ref, alts, gt, dp)

逻辑说明:pysam.VariantFile能自动处理 bgzip 压缩和 tabix 索引,比手动读文本快很多。record.info返回的是类似字典的对象,取不存在的键会报错,所以用record.info.get("AF", None)更安全。sample["GT"]返回的是元组,比如(0, 1)表示杂合,(1, 1)表示纯合变异。参数上注意 VCF 的 POS 是 1-based,和 BED 不同,做区间交集时要转换。

4. 避坑与排查:坐标、ID、版本这三类问题最要命

4.1 坐标差一位导致区间全空

现象:用 bedtools intersect 做两个区间的交集,结果为空,但肉眼检查明明有重叠。原因:一个文件是 GFF(1-based),另一个是 BED(0-based),起始坐标差 1。解决:统一转成 BED 格式再操作,或者用bedtools的-a和-b参数时确认两边坐标系一致。我一般会在流程开头加一步awk 'BEGIN{OFS="\t"}{$4=$4-1; print}'把 GFF 转成 BED 风格。

4.2 基因 ID 版本号导致匹配失败

现象:用 Ensembl ID 去匹配注释文件,明明基因存在却匹配不上。原因:Ensembl ID 带版本号,比如ENSG00000139618.15,而注释文件里可能只写ENSG00000139618。解决:匹配前统一去掉点号后面的版本号,用sed 's/\..*//'或 Python 的split(".")[0]。注意有些旧版注释文件反而带版本号,所以要先检查两边格式。

4.3 参考基因组版本不一致

现象:比对率正常,但变异检测结果里大量假阳性。原因:测序数据用的是 GRCh37,比对时用的参考基因组是 GRCh38,坐标整体偏移。解决:在流程最开始确认参考基因组版本,用samtools view -H看 BAM header 里的@SQ行,和 GTF 的染色体命名对比。GRCh37 用chr1,GRCh38 有些版本用1,命名不一致也会导致工具报错。

4.4 内存不足导致大文件处理中断

现象:用 Python 读一个几 GB 的 VCF 或 GTF,跑到一半被系统 kill。原因:一次性readlines()把整个文件加载进内存。解决:改用流式读取,for line in open(file)或pysam的迭代器。如果必须随机访问,先建索引,VCF 用tabix,BAM 用samtools index。

4.5 属性字段解析时引号丢失

现象:从 GTF 里提取gene_name,结果拿到的是空值或带引号的字符串。原因:GTF 的属性格式是gene_name "TP53";,正则写错就匹配不到。解决:用成熟库如gffutils或pyranges,不要手写正则。如果非要手写,用re.search(r'gene_name "([^"]+)"', attr)并处理转义。

5. 把课件变成可复用的检查清单

课件最后一页列了一个「数据交接检查清单」,我把它改成了自己常用的版本,每次拿到新数据先过一遍。第一步,确认文件格式:file命令看是不是 gzip 压缩,head看前几行判断是 FASTA 还是 FASTQ。第二步,确认坐标系:GFF 看第四列,BED 看第二列,VCF 看第二列,心里默念「1-based 还是 0-based」。第三步,确认 ID 类型:是 Ensembl 还是 Entrez,带不带版本号,和注释文件是否一致。第四步,确认参考基因组版本:BAM header 里的@SQ和 GTF 第一列对比。第五步,小样本测试:先拿前 1000 条记录跑通流程,再上全量数据。

这套清单帮我省过很多次「后悔药」。有一次我直接拿全量数据跑富集,结果因为 ID 版本号问题白等了两小时,后来先跑 100 条测试,五分钟就发现了问题。另一个习惯是:所有转换脚本都加一行print输出前三条转换后的记录,肉眼扫一眼坐标和 ID 对不对,比事后 debug 快得多。

如果你刚开始接触这些数据库和格式,建议不要贪多,先把 Ensembl 的 GTF 和 FASTA 玩熟,再扩展到 VCF 和 KEGG。课件里的内容足够你搭起一个最小可用的分析框架,剩下的就是在真实数据里踩坑、填坑。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进