X-ray重金属检测仪工程文件的自动格式转换

X-ray重金属检测仪工程文件的自动格式转换


一、问题背景

仪器简介

X射线重金属检测仪
  这个小巧的机器就是重金属检测仪,看似方便实则对试验员来说及其不方便的仪器。直接说这个设备输出方面的常规步骤。这个设备检测一个样品的时间大概在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文件,然后写下了这个脱裤子放屁的脚本。各位看官就当熟悉一下系统自动化吧,这个脚本在文中提到的这个问题上已经毫无意义了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值