首页 / 资讯中心 / 文章详情

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

生物信息入门:常用数据库与数据格式解析及避坑指南 ★ FEATURED ARTICLE
简介这份课件面向生物信息学入门学习者、生命科学专业学生及需要快速梳理数据资源的科研人员系统讲解常用生物数据库与数据格式的核心知识。内容围绕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}?expand1 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}?typecdna 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)逻辑说明第一段请求用expand1让返回结果包含转录本列表方便后续遍历。第二段请求的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 减 1BED 转 GFF 要把 start 加 1end 不变。很多转换脚本出错就出在这一步。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 的质量编码有 Phred33 和 Phred64 两种老数据可能是后者用seqkit stats看不出来需要用fastqc或seqkit fx2tab检查质量值范围。3.2 GFF/GTF 的九列字段逐列拆解GFF 和 GTF 都是九列制表符分隔前八列含义相同第九列不同。GFF 的第九列是keyvalue键值对GTF 是key value形式。很多工具只认其中一种比如featureCounts默认读 GTFbedtools更习惯 GFF。列号字段名含义常见取值1seqid染色体或 scaffoldchr1, NC_000001.112source注释来源ensembl, havana3type特征类型gene, mRNA, exon, CDS4start起始坐标1-based整数5end终止坐标1-based整数6score置信度分数通常为 .7strand链方向, -, .8phaseCDS 相位0, 1, 29attributes属性列表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 做两个区间的交集结果为空但肉眼检查明明有重叠。原因一个文件是 GFF1-based另一个是 BED0-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 用chr1GRCh38 有些版本用1命名不一致也会导致工具报错。4.4 内存不足导致大文件处理中断现象用 Python 读一个几 GB 的 VCF 或 GTF跑到一半被系统 kill。原因一次性readlines()把整个文件加载进内存。解决改用流式读取for line in open(file)或pysam的迭代器。如果必须随机访问先建索引VCF 用tabixBAM 用samtools index。4.5 属性字段解析时引号丢失现象从 GTF 里提取gene_name结果拿到的是空值或带引号的字符串。原因GTF 的属性格式是gene_name TP53;正则写错就匹配不到。解决用成熟库如gffutils或pyranges不要手写正则。如果非要手写用re.search(rgene_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。课件里的内容足够你搭起一个最小可用的分析框架剩下的就是在真实数据里踩坑、填坑。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站