4. 输出格式解析:从TSV到JSON的字段密码

拿到InterProScan结果,第一眼看到的是什么?一堆文件。

TSV、GFF3、XML、JSON,四种格式摆在你面前。新手常问:「我该用哪个?」

我的回答是:都学一遍。因为每个格式都有自己的战场,选错了后面全是坑。

4.1 TSV/CSV:轻量级表格,人类友好

这俩是最直观的格式。一行一条记录,列用制表符或逗号隔开。

我个人习惯用TSV,因为基因ID和描述里偶尔会带逗号,用TSV省心。

先看一个真实输出的表头结构:

# InterProScan 5.63-95.0
# Job ID: job_20250201_001
# Sequence: Seq_001
# MD5: a1b2c3d4e5f6...
# Length: 450
# Analysis: InterProScan
# Database: Pfam,PRINTS,SUPERFAMILY,ProSiteProfiles,ProSitePatterns,SFLD,Gene3D,Hamap,Coils,PANTHER
# 1. 序列ID  2. MD5  3. 序列长度  4. 分析数据库  5. 签名访问号
# 6. 签名描述  7. 起始位置  8. 终止位置  9. 得分  10. 状态
# 11. 日期  12. InterPro访问号  13. InterPro描述  14. GO注释
# 15. 通路注释
Seq_001	a1b2c3...	450	Pfam	PF00001	7tm_1	35	310	1.2E-45	T	2025-02-01	IPR000276	G protein-coupled receptor
GO:0004930|GO:0007186	REACT_1234

大家注意第14列和第15列。GO注释是以竖线分隔的,通路注释是逗号分隔的。我踩过这个坑——写脚本解析时没考虑多值字段,结果丢了很多信息。

关键字段快速对照表:

列序号 字段名 说明
1 序列ID 匹配到数据库的序列标识
4 分析数据库 例如 Pfam、PANTHER 等
5 签名访问号 数据库内部ID,如 PF00001
12 InterPro访问号 跨数据库统一ID,如 IPR000276
14 GO注释 多个GO用竖线分隔

TSV最大的优点是能直接丢进Excel。快速浏览、筛选、画个柱状图都非常方便。

4.2 GFF3:基因组的结构语言

GFF3是基因组领域的老大哥。InterProScan用它输出域结构注释,说白了就是给每条序列画一张「功能域地图」。

看一个GFF3片段就懂了:

##gff-version 3
##sequence-region Seq_001 1 450
Seq_001	InterProScan	mobile_genetic_element	1	20	.	+	.	ID=mge00001;Name=REP_1
Seq_001	InterProScan	protein_match	35	310	1.2E-45	+	.	ID=pfam00001;Name=7tm_1;DbXref=InterPro:IPR000276
Seq_001	InterProScan	similarity	200	250	5.6E-12	+	.	ID=sim00001;Target=SUPERFAMILY:SSF12345 200 250

GFF3有九列,固定格式。我刚开始做的时候,老记不住第九列是属性列,里面可以放一大堆东西,用分号隔开。

列号 字段 说明
1 seqid 序列ID
2 source 固定为 InterProScan
3 type 特征类型:protein_match、domain、repeat 等
4-5 start, end 匹配到的起始/终止位置
6 score E-value 或位分值
7 strand 链方向,蛋白质通常为 +
8 phase 阅读框,蛋白质注释用 .
9 attributes 包含 ID、Name、DbXref 等

避坑指南:GFF3的第九列属性解析最容易被忽略。我曾经因为没解析 DbXref 字段里的 InterPro ID,绕了一大圈去数据库查冗余信息。

4.3 XML:结构化但庞杂

XML格式非常完整,但也非常重。内容很详细,适合做深度的跨数据库交叉查询。

下面是我提取的一个XML关键片段:

<protein>
  <protein_seqid>Seq_001</protein_seqid>
  <length>450</length>
  <matches>
    <match>
      <database>Pfam</database>
      <signature_ac>PF00001</signature_ac>
      <locations>
        <location>
          <start>35</start>
          <end>310</end>
          <score>1.2e-45</score>
        </location>
      </locations>
      <interpro_ac>IPR000276</interpro_ac>
      <go_terms>
        <go_term>GO:0004930</go_term>
      </go_terms>
    </match>
  </matches>
</protein>

XML里 <locations> 和 <annotation> 是嵌套的,层级很深。如果你打算解析XML,我建议直接用Python的 ElementTree,别自己写字符串切割。

不过说真的,大部分时间我们并不需要全部字段。XML里有的信息TSV里基本都有。只有在需要做多对多关联的时候,XML的树形结构才显示出优势。

4.4 JSON:现代管道的最佳搭档

如果你写Python或者JavaScript做进一步分析,JSON是不二之选。

嗯,这里注意看JSON的数组结构:

{
  "seqid": "Seq_001",
  "length": 450,
  "matches": [
    {
      "database": "Pfam",
      "signature_ac": "PF00001",
      "locations": [
        {
          "start": 35,
          "end": 310,
          "score": 1.2e-45
        }
      ],
      "interpro_ac": "IPR000276",
      "go_terms": ["GO:0004930", "GO:0007186"]
    }
  ]
}

JSON的好处就是键值对清晰,容易遍历。不像GFF3那样还得解析字符串。而且不冗余,相比XML少了将近一半的字符,网络传输快很多。

你可能会问:既然JSON这么好,为什么还要学其他格式?

因为下游工具只认特定的格式。比如做基因组浏览器的,就要GFF3。做统计分析批量处理的,就要TSV。做自动化管道的,JSON最顺手。

4.5 四种格式的横向对比

我把各格式的特点和适用场景整理成一个表,方便你回顾:

特点 TSV/CSV GFF3 XML JSON
人类可读性 ★★★★★ ★★★★☆ ★★☆☆☆ ★★★★☆
机器可读性 ★★★★☆ ★★★☆☆ ★★★★★ ★★★★★
典型行数 多行并列 多行并列 单行嵌套 单行嵌套
多值字段 分隔符拼接 第九列属性 子元素 数组
推荐使用 初步浏览、Excel分析 基因组浏览器集成 深度交叉查询 管道自动处理

4.6 格式枢纽:数据流的十字路口

InterProScan 输出格式流转 InterProScan TSV/CSV GFF3 XML JSON 特征提取接入点 · 做机器学习特征矩阵 → CSV 最适合 · 做结构域富集分析 → XML/JSON 更方便

看到这张图了吗?四种格式就像四条分叉路。你要去哪个目标,就选哪条路。

4.7 我的一点经验之谈

最后,说说我自己的选择标准:

  • 快速看看结果长什么样 → 用TSV,直接cat或less
  • 给导师或审稿人提交数据 → 附一份TSV,他随时能打开
  • 搭建自动化流程 → 用JSON,Python的json模块一行搞定
  • 做基因组可视化 → 用GFF3,IGV或JBrowse直接拖进去
  • 批量跨库交叉查询 → 用XML,结构最严谨

我记得有一次搭建生产环境自动化管道时,团队里有人坚持只用TSV,结果解析GO注释时维度全拆开了。后来替换成JSON,问题迎刃而解。

你想想看,同样一份数据,四种语言。多学一种不亏,但选错一种,后面就全是补丁。改代码的痛,我太懂了。