需求分析
HMDB(Human Metabolome Database)离线数据库提供了完整的代谢物数据,但官方数据文件采用 XML 格式存储,不适合直接进行人工查看和分析。
本项目目标是将 HMDB All Metabolites 全量 XML 数据转换为 CSV 文件,并按照需求保留指定字段,生成结构清晰、便于查询的数据表格。
输入文件为 HMDB 官方离线 XML 数据:
C:\Users\Administrator\Documents\HMDB离线数据库\hmdb_metabolites\hmdb_metabolites.xml输出文件为:
hmdb_output.csv最终 CSV 文件固定包含以下字段:
• Metabolite ID • Common Name • KEGG Compound ID • Kingdom • Super Class • Class • Sub Class • Direct Parent • Chemical Formula • Synonyms • Description
由于全量数据库数据量较大,转换过程需要考虑运行效率和内存占用问题。
实现思路
1. 项目结构
项目主要包含两个脚本:
hmdb_xml_to_csv.py
split_csv.py其中:
• hmdb_xml_to_csv.py负责 XML 数据转换。• split_csv.py负责对生成后的 CSV 文件进行拆分。
整体流程:
HMDB XML 文件
↓
XML 数据读取
↓
字段提取与整理
↓
CSV 文件生成
↓
大文件拆分
↓
最终数据表格2. XML 数据转换
主程序负责读取 HMDB XML 文件,并完成以下工作:
• 加载输入文件。 • 按记录读取代谢物数据。 • 根据需求提取指定字段。 • 处理字段格式。 • 输出 CSV 文件。
代码框架如下:
import csv
import xml.etree.ElementTree as ET
SOURCE_XML = "hmdb_metabolites.xml"
OUTPUT_CSV = "hmdb_output.csv"
def read_xml(xml_path):
"""
读取 XML 数据
具体解析逻辑隐藏
"""
pass
def extract_data(record):
"""
提取指定字段
具体字段映射逻辑隐藏
"""
pass
def export_csv(rows, output_path):
"""
写入 CSV 文件
"""
pass
def main():
records = read_xml(SOURCE_XML)
rows = []
for record in records:
rows.append(
extract_data(record)
)
export_csv(rows, OUTPUT_CSV)
if __name__ == "__main__":
main()3. 字段处理
程序根据 HMDB XML 数据结构建立字段映射关系。
处理规则:
• 单值字段直接写入 CSV。 • 多值字段合并到同一个单元格。 • 多个结果之间使用 ;分隔。• 缺少字段时输出空值。
其中 Synonyms 等多值字段需要特殊处理,保证完整内容不会被拆分。
4. CSV 输出
导出的 CSV 文件保持固定表头顺序:
FIELDS = [
"Metabolite ID",
"Common Name",
"KEGG Compound ID",
"Kingdom",
"Super Class",
"Class",
"Sub Class",
"Direct Parent",
"Chemical Formula",
"Synonyms",
"Description",
]输出过程中:
• 不增加额外字段。 • 不生成无关文件。 • 保持字段结构稳定。
5. 文件拆分
由于全量数据较大,提供 CSV 拆分工具。
运行方式:
python split_csv.py \
--input hmdb_output.csv \
--out-dir ./hmdb_split \
--parts 10拆分工具支持:
• 指定输入文件。 • 指定输出目录。 • 自定义拆分数量。
通过拆分降低单个文件大小,提高数据查看效率。
部分代码示例
CSV 拆分工具框架:
import csv
import argparse
def split_file(input_file, output_dir, parts):
"""
根据指定数量拆分 CSV 文件
具体拆分逻辑隐藏
"""
pass
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--input")
parser.add_argument("--out-dir")
parser.add_argument("--parts")
args = parser.parse_args()
split_file(
args.input,
args.out_dir,
args.parts
)
if __name__ == "__main__":
main()以上代码仅展示项目结构和调用方式,核心数据解析、字段映射及处理逻辑不公开。
夜雨聆风