写在前面
这篇博客是我在泽哥的鼓励下,对本学期在西北农林科技大学园艺学院304的试验内容的一个总结。同时我也觉得在液质、气质等一些由仪器标准化输出报告的试验中,非常适合引入程序脚本去处理试验结果。这样的话,能够大大减少试验员的时间,让他们有更多的时间去投入到价值更高的工作中去。
对样品编号过程的优化
问题背景:
在样品编号时,由于软件提供的自增工具(Autoincrement),只能适用于数字或着最后一位为数字的情况。但是在试验里,样品命名中至少都会包含两个以上的变量,而且在命名是如果仅仅使用数字时,对于不同样品的区分也不够直观。
解决方法:
通常列表的分割符号是“\n”,因此只需要使用在将样品命名提前命名好,然后样品名字用“\n”拼接,即可直接复制到excel、analyst和multiquant等软件,大大节约了在操作软件是样品名称不直观和样品名称输入时间太长的问题。
python代码实现:
#trial_name.py
import pyperclip
from itertools import product
name_formula = input("名称公式:")
#统计变量的个数
var_num = name_formula.count("{}")
#把{}替换为%s,以列表和元组的形式填充字符串
name_formula = name_formula.replace('{}', '%s')
factors = []
for i in range(0, var_num):
factor = input("变量{}的范围:".format(i+1))
if "-" in factor:
li = [chr(i) for i in range(ord(factor[0]), ord(factor[-1])+1)]
factors.append(li)
elif ',' in factor:
li = factor.split(',')
factors.append(li)
text =""
#排列组合
for i in product(*factors):
#结果拼接
text = text + name_formula%i +"\n"
#将结果写入剪贴板
pyperclip.copy(text)
示例:
上述程序使用要点:
- 每一个{}代表一个变量,{}可以出现在公式的任何位置;
- 变量范围输入有两种,①用”-“连接,通过ASCII自增的方式创建变量列表,意味着可以用字母,阿拉伯数字,罗马数字等,只要ASCII相近的字符都可以使用;②用”,“分隔,该方法必须穷举出该变量所有的值,这种方法繁琐,但具有普适性。
液相质谱仪docx报告的数据提取
问题背景:
此处定位西北农林科技大学园艺学院304液相质谱仪。样品的谱图经过multiquant软件确定峰面积之后,可以导出docx的报告文件。通常我们从这个报告文件通过复制黏贴的方式将数据筛选出来,效率低下,并且报告文件中含有大量图片,导致文档篇幅很长,目标数据分散。
如上图,这是一个含有102个样品的液相质谱报告,报告篇幅达到了158页,由此可见,使用复制黏贴的方式筛选数据无疑是复杂耗时并且效率低下的。
解决方法:
python有一个第三库docx库能够准确的解析docx文件,因此可以用脚本实现数据的筛选。获取文档中的文本后,用正则筛选出检测物质的名称,然后获取文档中的表格筛选出数据,具体方法如下。
r
import argparse
import os
from docx import Document
import re
import pandas as pd
import sys
#设置外部参数,默认获取表格第六列,默认文件输出路径为桌面
parser = argparse.ArgumentParser(description='液相质谱仪docx报告处理.')
parser.add_argument('-i', dest='infile', help='docx报告的文件路径 ',required=True)
parser.add_argument('-o', dest='outfile', help='输出数据文件名 ', required=True)
parser.add_argument('-c', '--column', type=int, choices=[1, 2, 3, 4, 5], help="select the column you want to deal with", default=5)
parser.add_argument('-v', '--path', help="输出文件存放目录", default='C:\\Users\\biashap\\Desktop\\')
args = parser.parse_args()
#判断输入和输出文件的类型
if args.infile[-5:] != ".docx" or args.outfile[-4:] != ".csv":
print(<