技术标签: 笔记
这个小巧的机器就是重金属检测仪,看似方便实则对试验员来说及其不方便的仪器。直接说这个设备输出方面的常规步骤。这个设备检测一个样品的时间大概在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文件,然后写下了这个脱裤子放屁的脚本。各位看官就当熟悉一下系统自动化吧,这个脚本在文中提到的这个问题上已经毫无意义了。
文章浏览阅读1.8k次,点赞12次,收藏51次。记录自己比较感兴趣的2D目标检测文章。_target-aware dual adversarial learning
文章浏览阅读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中的栈类
文章浏览阅读179次。MySql】Navicat 连接数据库出现1251。– 修改远程连接权限 % 可换为自己的电脑ip。_navicat11 1251
文章浏览阅读872次。python3使用pymysql返回字典_pymysql返回字典
文章浏览阅读1.8k次。文章目录-命令解释二前言emacsjedjoenano================picosed===================vi,vim============mtype=============rgrep==========excmpbzcmpcommdiff===========bzdiffdiffstatdiff3find==============locate/slocate=========whereis==========updatedbwhich=========basena.._shell shuf
文章浏览阅读413次,点赞9次,收藏7次。然后再新建项目,选好data和project就可以了。四个文件夹建好,将下载好的Refworks数据。download_xxxx(这个自己定),放到文件夹input中,进行格式转化。然后将处理好的数据放到data中。_手把手教你用citespace
文章浏览阅读2k次。三次握手和四次挥手的总结_tcp三次挥手四次挥手
文章浏览阅读2k次。平时在用“Login with Facebook”功能进行跳转登录时,因为其用到了多个URL重定向跳转,所以总会给我有一种不安全的感觉。但是,要想发现Facebook漏洞,并非易事,需要莫大的功夫和精力,更别说涉及登录的Facebook OAuth了,这更是难上加难。然而,我就发现了Facebook OAuth这么一个漏洞,获得了Facebook官方$55,000的奖励。就是这么一个漏洞...
文章浏览阅读5.7k次,点赞4次,收藏27次。docker中容器和镜像的关系_docker镜像和容器的关系
文章浏览阅读4.3k次。idea运行java时报错 错误: 找不到或无法加载主类 _idea找不到或无法加载java主类
文章浏览阅读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 性能优化
文章浏览阅读436次。1、在/home/mysql目录下新建两个文件夹,一个叫data另一个叫conf。_docker jdk8