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

智能推荐

Elm-Flatris:优雅的Elm语言实现的俄罗斯方块游戏-程序员宅基地

文章浏览阅读384次,点赞4次,收藏9次。Elm-Flatris:优雅的Elm语言实现的俄罗斯方块游戏项目地址:https://gitcode.com/w0rm/elm-flatris项目简介Elm-Flatris 是一个基于 Elm 语言开发的经典俄罗斯方块游戏。Elm是一种功能型前端编程语言,以其简洁、类型安全和易于维护的特性而受到开发者喜爱。该项目不仅是一个娱乐应用,更是学习Elm语言及函数式编程理念的理想实例。技术分析E...

Ping通外网百度,但是打不开网页(能登入QQ和微信,但是打不开网页)_电脑能ping通百度,无法打开网页-程序员宅基地

文章浏览阅读8.5k次,点赞7次,收藏15次。声明:本文章仅用于自己备份,以防再次发生此类情况。参考转载:https://blog.csdn.net/wukai0909/article/details/96459029进行如下尝试:1、我先是重装网卡驱动,重启电脑,故障还是没有解决。2、打开CMD(按住WIN+R),输入netsh winsock reset,然后重启电脑没有恢复。需要进入管理员模式:搜索cmd,按住shift,右键进入管理员模式3、Chrome链接网页提示了proxy相关错误。按照要求点开Ch._电脑能ping通百度,无法打开网页

unity3d 实现简单水墨画效果_unity3d shader 水墨动画-程序员宅基地

文章浏览阅读6.6k次,点赞2次,收藏8次。水墨效果,素材简陋:文章参考http://gad.qq.com/article/detail/18724,原理可以看这位大佬的文章,我就贴上自己工程源码:https://download.csdn.net/my_unity3d shader 水墨动画

(Java毕业设计)招聘信息管理系统(基于java+springboot)附源码_java人力资源管理系统招聘管理-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏17次。在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括招聘信息管理系统的网络应用,在外国招聘信息管理系统已经是很普遍的方式,不过国内的线上管理系统可能还处于起步阶段。招聘信息管理系统具有招聘信息管理功能的选择。_java人力资源管理系统招聘管理

冯诺依曼、哈佛、RISC、CISC_冯诺依曼曼指令和数据区分-程序员宅基地

文章浏览阅读1.3w次,点赞5次,收藏20次。几个基础材料(源:http://jwc.seu.edu.cn/zq/signal/new/importent/zhang5_6/feng.htmhttp://jwc.seu.edu.cn/zq/signal/new/importent/zhang5_6/harvard.htmhttp://dingjun.net/dingjun/html/14/84FB43402106C575.html_冯诺依曼曼指令和数据区分

Netty——深入解析心跳检测机制_netty 服务端心跳检测-程序员宅基地

文章浏览阅读428次。客户端定时每X秒(推荐小于60秒)向服务端发送特定数据(任意数据都可),服务端设定为X秒没有收到客户端心跳则认为客户端掉线,并关闭连接触发onClose回调。当需要服务端定时给客户端发送心跳数据时, $gateway->pingData设置为服务端要发送的心跳请求数据,心跳数据是任意的,只要客户端能识别即可。当设置为服务端主动发送心跳时,如果客户端最近有发来数据,那么证明客户端存活,服务端会省略一个心跳,下个心跳大约1.5*$gateway->pingInterval秒后发送。心跳检测时间间隔 单位:秒。_netty 服务端心跳检测

随便推点

全通滤波器 相位校正 matlab,一文读懂滤波器的线性相位,全通滤波器,群延迟...-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏19次。延迟和全通滤波器,来解释这些概念。先说结论:线性相位能保证信号中各频率成分的相对相位关系不改变。通俗解释是:信号经过线性相位滤波器后,各个频率分量的延时时间是一样的。1. 延迟举一个最简单的FIR的例子,延迟。假设16kHz的采样频率,一个采样周期的延迟,可以用FIR来表示。利用Matlab来观看这个滤波器的频率响应,代码如下。采样频率为Fs = 16kHz, 采样周期为Ts,Ts = 1/Fs。..._matlab如何对滤波器进行相位校准

Google Earth影像数据破解之旅-程序员宅基地

文章浏览阅读890次。“Zed, you are so excellent.” 为什么要写这句英文?容我卖个关子稍后再解释。 相信大多数人都体验过Google Earth(简称GE),我对GE最初的印象是在大学宿舍,当时Google刚刚推出GE时,舍友们喜欢在上面找自己的家,惊讶于它的精细程度,并担心是否对中国有一定的安全隐患。 坦白说,当时我对GE上找家没一点兴趣,但不能否认..._googleearth galil算法加密

oracle 11 ex 版本图文安装-程序员宅基地

文章浏览阅读354次。Oracle 11g XE 是 Oracle 数据库的免费版本,支持标准版的大部分功能,11g XE 提供 Windows 和 Linux 版本。做为免费的 Oracle 数据库版本,XE 的限制是:最大数据库大小为 11 GB可使用的最大内存是 1G一台机器上只能安装一个 XE 实例XE 只能使用单 CPU,无法在多CPU上进行分布处理..._oracle 11 xe

iPhone 14 Plus与iPhone 14 Pro:你应该买哪一款-程序员宅基地

文章浏览阅读1k次。iPhone 14 Plus与iPhone 14 Pro:你应该买哪一款?

单片机毕设 stm32智能疫情防控门禁系统_单片机stm32f103c6智能安防系统设计-程序员宅基地

文章浏览阅读336次。 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是基于Stm32的智能疫情防控门禁系统学长这里给一个题目综合评分(每项满分5分)难度系数:3分工作量:3分创新点:5分针对当前的疫情形势,设计一款智能防疫门禁系统。_单片机stm32f103c6智能安防系统设计

PTA 求给定精度的简单交错序列部分和_pta求给定精度的简单交错序列部分和c语言-程序员宅基地

文章浏览阅读1.1k次。本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。输入格式:输入在一行中给出一个正实数eps。输出格式:在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。输入样例1:4E-2输出样例1:sum = 0.854457输入..._pta求给定精度的简单交错序列部分和c语言

推荐文章

热门文章

相关标签