一、问题背景
仪器简介
这个小巧的机器就是重金属检测仪,看似方便实则对试验员来说及其不方便的仪器。直接说这个设备输出方面的常规步骤。这个设备检测一个样品的时间大概在12分钟,每个样品的检测报告写在“.hdx”的工程文件里面。这个工程文件只能够用捆绑的软件“HD DATA VIEWER”打开,然后用该软件导出为csv文件。因为每一个工程文件或csv文件只记录了一个样品的的元素信息,因此必须对所有的csv进行汇总。由此可见,在测试样品很多的时候,这个工作是及其复杂的,但同时该过程又是非常重复的,因此可以尝试用脚本去处理该问题。
二、解决思路
csv是很常见的数据存储格式,就是一种类似txt的文本文件,因此用脚本很容易处理。该问题的难点在于如何用脚本自动化地将hdx工程文件转化成csv文件。
python有windows系统自动化的库叫做PyAutoGUI,这个库可以调用windows的api,从而控制鼠标、键盘和剪切板,刚好能够满足需求。
脚本实现
由于这个脚本个性化程度特别高,因此大家看看思路过程就可以了,具体需要的时候还是需要按照自己的情况去写脚本。
import pyautogui
import win32clipboard
import os
import time
import sys
import pandas as pd
import pymysql
#实现点击功能的函数,传入图片,点击图片所在位置
def mouse_click(image,xoffset=0, interval=1, duration=1):
x, y = pyautogui.locateCenterOnScreen(image)
pyautogui.click(x+xoffset, y, interval=interval,duration=duration)
time.sleep(1)
#将文本写入剪贴板的函数
def settext(text):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, text)
win32clipboard.CloseClipboard()
if __name__ == "__main__":
#工程文件存在的目录
data_dir = os.listdir("D:\mudan_heavy_element\Data")
for second_dir in data_dir:
#拼接工程文件的完整路径
files_dir = os.listdir("D:\mudan_heavy_element\Data\{}".format(second_dir))
for file_paths in files_dir:
#点击打开按钮,准备导入文件
mouse_click('tool_open.PNG')
#键入文件路径(系统自动定位焦点,所以不用通过点击获得焦点)
pyautogui.typewrite("D:\mudan_heavy_element\Data\{}\{}".format(second_dir, file_paths))
#控制键盘,按下回车键,成功导入工程文件
pyautogui.hotkey('enter')
#程序暂停1秒钟
time.sleep(1)
#点击导出csv的按钮
mouse_click('tocsv.PNG')
#输入csv文件的完整路径(包括文件名)
if file_paths[-9] == '_':
pyautogui.typewrite("D:\mudan_heavy_element\csv_data\{}".format(file_paths[-8:-4]))
else:
pyautogui.typewrite("D:\mudan_heavy_element\csv_data\{}".format(file_paths[-9:-4]))
#键入回车,完成格式转化
pyautogui.hotkey('enter')
#程序睡眠一秒
time.sleep(1)
#回车清除软件提醒
pyautogui.hotkey('enter')
#连接mysql,将数据导入mysql
columns = "treatments"
#mysql连接
db = pymysql.connect("localhost","root","123456zhl", "testdb")
#获取游标
cursor = db.cursor()
# 创建数据表,如果数据表存在就删掉重新创建
cursor.execute("DROP TABLE IF EXISTS mudan_heavy_element")
# g获取所有csv文件的文件名
csv_files = os.listdir("D:\\mudan_heavy_element\\csv_data")
# pandas读取第一个csv文件
first_table = pd.read_table(r'D:\\mudan_heavy_element\\csv_data\\{}'.format(csv_files[0]), sep=',', skiprows=4, skipfooter=26, engine='python', encoding='utf-8')
#获取测定的额所有元素的名称
elements_list = list(first_table['元素'])
#构建创建表的mysql命令,创建数据表,用样品名和元素名作为表的字段,且所有字段都为字符型
sql = "CREATE TABLE MUDAN_HEAVY_ELEMENT ( treatments CHAR(20)"
for element in elements_list:
sql = sql + ','+str(element.replace(' ', '_')) + " CHAR(20)"
for element in elements_list:
columns = columns + ',' + str(element.replace(' ', '_'))
sql = sql + ")"
#创建数据表
cursor.execute(sql)
#向数据库提交修改
db.commit()
#读取csv文件,并将数据导入mysql中
for csv_file in csv_files:
#利用pandas读取csv文件
table_file = pd.read_table("D:\\mudan_heavy_element\\csv_data\\{}".format(csv_file), sep=',', skiprows=4, skipfooter=26, engine='python', encoding='utf-8')
#构建mysql数据导入命令
sql = """ INSERT INTO MUDAN_HEAVY_ELEMENT ({}) VALUES (""".format(columns)
values = '"' + csv_file[0:-4].replace('-', '_') + '"'
for element in elements_list:
value = table_file.loc[table_file['元素']==element,'含量/ppm']
values = values +"," +'"'+ value.values.tolist()[0] + '"'
sql = sql + values + ")"
#异常捕获
try:
#执行数据导入命令,并提交数据库
cursor.execute(sql)
db.commit()
except Exception as err:
#如果报错输出错误,然后数据表回滚
print(err)
db.rollback()
#程序暂停
os.system('pause')
#数据插入完毕,关闭数据库
db.close()
#如果需要从mysql中导出,在mysql终端上输入 mysql > select * into outfile 输出文件名.csv就可以了
其实这里可以不必使用mysql,直接利用pandas库拼接数据框汇总数据就可以了。但是当属是出于数据管理的角度使用的MySQL,mysql可以方便的导出成任何格式,便于数据的备份,而且在同一局域网或者设置内网穿透的情况下,可以在手机/电脑远程的查看、编辑和备份数据,真正做到可以和数据随时在一起,随时处理和分享数据,会比直接通过文件要方便的多。不过,尝试过一段时间后,我自己也放弃了。虽然以上优点不可否认,但是实际上实验数据的使用频率很低,而且也没有远程访问的必要,并且学习成本比较高,后来就不了了之了,也许之后如果有了更简便的工具,亦或者试验设备都支持mysql之后,MySQL才能真正地走入园艺试验员的科研生活。
总结
吐槽一下这个仪器吧,竟然不能够自动进样!而且测试仪个样品十分钟,按理说测定时间其实很短了,但是正因为这样,把试验员的时间撕裂成了一段段难以利用的碎片,非常的ugly。然后输出方便竟然是输出为hdx工程文件,我强烈怀疑厂家在强制推销自己的软件,完全可以把软件的功能集成到仪器里,然后仪器直接导出为csv文件啊!我认为现代仪器给出的报告都应该是csv、txt、excel、word、xml,哪怕是pdf,这些可读性强而且便于解析的文件格式。然后吹一下这个仪器自带的软件,这个软件有批处理功能,可以批量的处理导出的工程文件,非常赞。
最后吐槽一下我自己,当时第一次也是唯一一次使用这个仪器和软件,没发现这个软件的批处理功能,尽管人家批处理按钮做的还挺大的(当时可能是因为要另外安装软件把我气懵了)。所以竟然单个地将工程文件转化为csv文件,然后写下了这个脱裤子放屁的脚本。各位看官就当熟悉一下系统自动化吧,这个脚本在文中提到的这个问题上已经毫无意义了。