MIT开源Python包,统一处理Tecan/SpectraMax等实验室仪器的ASCII/Excel导出格式,输出整洁pandas DataFrame,支持自定义JSON recipe扩展。
Plate readers、spectrometers 以及其他所有台式仪器都各自发明了自己的导出格式。重复的孔板网格、动力学数据转储、宽表、长表、Excel 工作簿(其中某个位置埋着孔板网格)。大多数实验室的解决方案是针对每台仪器写一个一次性脚本,然后这些脚本就腐烂在某人的笔记本电脑上。
labparse 是一个免费的 MIT 许可证 Python 包,它走了一条不同的路。
pip install labparse
import labparse
result = labparse.parse("growth.asc")
result.data # tidy pandas DataFrame
result.wide() # one column per well
result.save_csv("tidy.csv")
labparse growth.asc --out tidy.csv
labparse kinetic.txt --wide
Recipe 是一种小的 JSON 格式描述,由确定性引擎执行。Tecan ASCII 导出文件、Molecular Devices SoftMax Pro 和 SpectraMax 动力学导出文件、通用宽表和长表 CSV 或 TSV,以及带有孔板表头行或孔板网格的 Excel 工作簿,都以捆绑 Recipe 的形式提供。
Recipe 就是普通的 JSON。你可以读取它、编辑它、把新的 Recipe 扔进 recipe 文件夹,然后分享给实验室里的人。labparse --list-recipes 显示所有已安装的 Recipe。
这一部分值得借鉴,即使你永远不碰孔板读数仪。
当 labparse 遇到不认识的格式时,它会把自己的模型(本地模型)展示给原始文件一次,然后由模型编写一个 Recipe。只有当 Recipe 真的能正确解析你的文件时才会被接受。错误的 Recipe 会被拒绝并重试,所以它不会悄无声息地产生坏数据。已接受的 Recipe 会被缓存到你的主目录中,所以每种格式最多只会产生一次 API 调用,缓存后的格式可以离线解析。
解析引擎本身从不调用模型。模型提出建议,确定性引擎做判断,你的测量数据始终只流经你能读懂的代码。
它按以下顺序查找模型:Claude CLI、Codex CLI、Anthropic key,然后是 OpenAI key,其中设置 base URL 可以指向任何 OpenAI 兼容服务器,包括本地模型。--llm off 完全禁用它,所有有捆绑 Recipe 或缓存 Recipe 的功能仍然正常工作。没有配置模型意味着未知格式会给出明确的提示信息,而不是一个错误的猜测。
每次解析返回的列都是相同的,不管是什么仪器:
像温度这样的额外仪器列会与标准列一起保留。Tidy 是 pandas、R 和所有统计工具实际想要的形状,.wide() 给出每个孔一列的电子表格布局,两者来自同一次解析。
仪器数据最终进入电子表格的原因是——文件落在哪里,电子表格就在哪里——而不是因为有人认为那是个好主意。基因组生物学论文指出 Excel 会破坏基因名十年后,这仍然是实验室科学中的默认故障模式。
直接将原始导出解析为整齐的表格,省去了数字被重新输入、重新格式化和悄悄更改的步骤。真相的来源始终是仪器写下的那个文件。
源代码、问题反馈和 README 都在 GitHub 上,如果你的仪器导出文件让 labparse 束手无策,打开一个 issue 并附上示例文件。这正是 Recipe 系统存在要吞下的那种格式。