原文地址:https://itxiaozhang.com/hmdb-xml-export-csv-and-split-5-parts/
如果您需要远程电脑维修或者编程开发,请加我微信咨询。

需求说明

HMDB(Human Metabolome Database)离线数据库以 XML 格式存储,单文件体积较大,二十多万条代谢物记录无法直接查看和筛选。

本次需求是把离线 XML 中需要的字段一次性提取出来,整理成 CSV 表格,并等分成 5 份,方便逐份查看、传输和交付。具体目标如下:

  1. 从 hmdb_metabolites.xml 中读取每一条代谢物记录。
  2. 提取固定的 12 个字段,包含标识、结构信息和分类信息。
  3. 导出 UTF-8-SIG 编码的 CSV,保证 Windows 下 Excel 直接打开不乱码。
  4. 把主 CSV 等分成 5 份,每份行数尽量接近。
  5. 导出完成后自动自检,输出行数、唯一性和空值统计。

最终 CSV 固定包含以下字段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
HMDB ID
代谢物名称
分子式
分子量
SMILES 结构
KEGG ID
PubChem CID
InChIKey
所属通路
来源
同义词
超类

其中「分子量」等字段存在多个候选数据来源,程序按内部优先级自动选取;「所属通路」「来源」「同义词」属于多值字段,需要去重后合并到同一个单元格。

程序设计

整体流程分为三步:解析 XML 导出主 CSV → 等分切割 5 份 → 自检并输出报告。

一、流式解析 XML

HMDB XML 体积较大,直接整体加载会占用大量内存。程序采用流式解析方式逐条读取代谢物记录,处理完一条即释放相关节点:

1
2
3
4
5
6
def iter_rows(xml_path, limit):
    """流式读取代谢物记录

    具体节点匹配与字段提取逻辑隐藏
    """
    pass

每条记录的字段映射关系,以及分子量等字段的取值优先级,属于脚本内部处理规则,此处不展开。

二、多值字段处理

「所属通路」「来源」「同义词」这类字段在原始数据中可能重复,直接拼接会产生冗余内容。程序统一做去重后合并到同一个单元格,分隔符由脚本内部固定。

其中「来源」无法直接读取,需要按 HMDB 本体层级逐层匹配后收集目标节点:

1
2
3
4
5
6
def extract_source(metabolite_elem):
    """按本体层级提取来源信息

    具体层级匹配规则隐藏
    """
    pass

去重合并部分:

1
2
3
4
5
6
def join_unique(items, sep):
    """去重后按指定分隔符合并

    具体实现隐藏
    """
    pass

三、等分切割

切割前先统计主 CSV 的数据行数,再按份数计算每份应包含的目标行数,除不尽的余数依次分配到前几份,保证各分片行数差距不超过 1 行:

1
2
3
4
5
6
def split_evenly(csv_path, out_dir, parts, force):
    """按行数尽量平均切割 CSV

    具体分配算法隐藏
    """
    pass

分片文件命名为 hmdb_selected_fields.part0001.csv 这类形式,写入到 splits_5 目录,每份都带完整表头。

四、自检报告

程序在导出和切割完成后自动校验,主要检查项包括:

  • 主 CSV 表头是否与预期一致,每行列数是否正确。
  • 5 份分片行数合计是否等于主 CSV 行数。
  • 分片表头是否与主 CSV 一致。
  • HMDB ID 是否存在重复。
  • 每一列的空值数量与占比。

安全机制

考虑到脚本涉及文件写入和批量切割,加入了以下保护设计:

  1. 默认不覆盖:输出文件已存在时直接报错并终止,必须在命令行显式加上 --force 参数才会覆盖,避免误删已有结果。
  2. 抽样试跑:提供 --limit 参数,可以只处理前 N 条记录,先验证字段提取是否正确,再执行全量导出。
  3. 输入校验:启动时检查源 XML 是否存在,不存在时直接抛出 FileNotFoundError;切割前检查主 CSV 是否有数据行、行数是否少于切割份数。
  4. 一致性校验:自检阶段逐项核对行数、表头和 ID 唯一性,一旦发现问题会打印明细并以非零状态码退出,便于在自动化流程中捕获失败。

使用方法与运行结果

脚本的源 XML 路径、输出路径和切割份数均在代码中固定,无需配置参数,普通用户只需运行:

1
python hmdb_export.py

首次使用或想先验证字段是否正确,建议先抽样试跑:

1
python hmdb_export.py --force --limit 2000

其中:

  • --limit 指定只处理前 N 条记录,0 表示全量。
  • --force 表示允许覆盖已存在的产出文件。

运行过程中会按进度打印处理条数,结束后输出自检报告:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
开始解析:your_path\hmdb_metabolites\hmdb_metabolites.xml
  已处理 20000 条代谢物记录...
导出完成:220945 条记录 -> hmdb_selected_fields.csv
切割完成:5 份 -> splits_5

=== 自检报告 ===
[通过] 列数 = 12
[通过] 主 CSV 数据行 = 220945
[通过] 分片 5 份,行数合计 = 220945
[通过] HMDB ID 唯一数 = 220945

分片大小:
  hmdb_selected_fields.part0001.csv  ...
各列空值数:
  HMDB ID: 0 (0.0%)
  ...

全部检查通过。

(上方行数为结构示意,实际以本机数据库为准。)

实现效果

脚本把原本需要人工反复翻查的字段提取工作压缩成一条命令:一次运行即可完成 XML 解析、12 个字段导出、5 份等分切割和全套自检。输出 CSV 可直接用 Excel 打开,分片后的文件体积适中,方便分发和比对。

对于代谢物数据整理、离线数据库转换、大批量字段提取等场景,这类固定口径的脚本可以减少重复劳动,同时通过自检报告保证结果可信。

视频版本