X-ray重金属检测仪工程文件的自动格式转换_hd data viewer-程序员宅基地

技术标签: 笔记  

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文件,然后写下了这个脱裤子放屁的脚本。各位看官就当熟悉一下系统自动化吧,这个脚本在文中提到的这个问题上已经毫无意义了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41144723/article/details/113923426

智能推荐

【论文汇总】2D目标检测文章汇总,持续更新_target-aware dual adversarial learning-程序员宅基地

文章浏览阅读1.8k次,点赞12次,收藏51次。记录自己比较感兴趣的2D目标检测文章。_target-aware dual adversarial learning

Java中的栈Stack、Deque、ArrayDeque、LinkedList_java中的栈类-程序员宅基地

文章浏览阅读1.1w次,点赞66次,收藏151次。文章目录先来说说Java中的Stack类不用Stack至少有以下两点原因该用ArrayDeque还是LinkedList?结论先来说说Java中的Stack类Java中Stack类从Vector类继承,底层是用数组实现的线程安全的栈。栈是一种后进先出(LIFO)的容器,常用的操作push/pop/peek。不过Java中用来表达栈的功能(push/pop/peek),更适用的是适用双端队列接口Deque,并用ArrayDeque/LinkedList来进行初始化。Deque<Integer&g_java中的栈类

Navicat 连接数据库出现1251_navicat11 1251-程序员宅基地

文章浏览阅读179次。MySql】Navicat 连接数据库出现1251。– 修改远程连接权限 % 可换为自己的电脑ip。_navicat11 1251

python3使用pymysql返回字典-程序员宅基地

文章浏览阅读872次。python3使用pymysql返回字典_pymysql返回字典

Shell脚本学习-阶段二十七-命令解释二_shell shuf-程序员宅基地

文章浏览阅读1.8k次。文章目录-命令解释二前言emacsjedjoenano================picosed===================vi,vim============mtype=============rgrep==========excmpbzcmpcommdiff===========bzdiffdiffstatdiff3find==============locate/slocate=========whereis==========updatedbwhich=========basena.._shell shuf

citespace使用流程(自用)_手把手教你用citespace-程序员宅基地

文章浏览阅读413次,点赞9次,收藏7次。然后再新建项目,选好data和project就可以了。四个文件夹建好,将下载好的Refworks数据。download_xxxx(这个自己定),放到文件夹input中,进行格式转化。然后将处理好的数据放到data中。_手把手教你用citespace

随便推点

TCP三次握手四次挥手详解_tcp三次挥手四次挥手-程序员宅基地

文章浏览阅读2k次。三次握手和四次挥手的总结_tcp三次挥手四次挥手

域账户信息导出脚本_Facebook OAuth漏洞导致的Facebook账户劫持-程序员宅基地

文章浏览阅读2k次。平时在用“Login with Facebook”功能进行跳转登录时,因为其用到了多个URL重定向跳转,所以总会给我有一种不安全的感觉。但是,要想发现Facebook漏洞,并非易事,需要莫大的功夫和精力,更别说涉及登录的Facebook OAuth了,这更是难上加难。然而,我就发现了Facebook OAuth这么一个漏洞,获得了Facebook官方$55,000的奖励。就是这么一个漏洞...

docker中容器和镜像的关系_docker镜像和容器的关系-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏27次。docker中容器和镜像的关系_docker镜像和容器的关系

idea运行java报错:找不到或无法加载主类_idea找不到或无法加载java主类-程序员宅基地

文章浏览阅读4.3k次。idea运行java时报错 错误: 找不到或无法加载主类 _idea找不到或无法加载java主类

java scriptengine,使用Java ScriptEngine(Groovy),如何使它更具性能?-程序员宅基地

文章浏览阅读1.2k次。I am using ScriptEngine in my app to evaluate some client code in my application.The problem is it's not performant enough and I need to take measures to improve the time of execution.Currently, it ca..._scriptenginemanager 性能优化

docker项目运行环境搭建(JDK8、mysql8、tomcat9、redis5、nginx1.14)_docker jdk8-程序员宅基地

文章浏览阅读436次。1、在/home/mysql目录下新建两个文件夹,一个叫data另一个叫conf。_docker jdk8

推荐文章

热门文章

相关标签