APP下载

基于Python的PEN3电子鼻nos文件关键信息自动提取工具设计

2019-02-11张喜红王玉香

关键词:格式文件电子鼻控件

张喜红 王玉香

(亳州职业技术学院, 安徽 亳州 236800)

随着传感器检测技术与模式识别等技术的进步,感官仿生设备得到了长足的发展[1-2]。电子鼻是一种模拟人体嗅觉的感官仿生设备,是感官仿生设备的典型代表之一。近年来电子鼻在环境检测、食品检验、中药材品鉴等方面应用中取得了可喜成绩,引起众多学者的关注[3-4]。德国AIRSENSE公司生产的PEN3电子鼻,因其小巧便携、测量快捷的优势,几乎成为国内开展仿生嗅觉研究的首选设备[5-6]。PEN3电子鼻系统自带上位机数据分析软件,内置多种常用数据分析算法(如判别分析LDA、主成份分析PCA),基本能够满足数据分析需求。

然而,面对大数据分析,PEN3电子鼻系统上位机内置的常用统计分析方法略有不足,无法充分满足实际需求;同时,与其他数据分析平台相比,PEN3电子鼻自带的数据分析软件在数据可视化方面也有不足;此外,PEN3电子鼻测量时所采集的数据以nos格式文件存储,不能直接导出以供第三方数据分析平台应用,需耗费人力进行整理,效率低下,错误率高。Python脚本语言易学易用、简洁高效,且提供了大量开源的数据分析及处理工具包,被称作数据分析和办公自动化的胶水语言,既能用于编写开发后台运行的脚本程序,又可用于编写图形界面程序[7-8]。

本次研究中,我们基于Python tkinter设计了一款能快速提取和整理PEN3电子鼻传感器测量数据的工具软件,具体的设计思路及方法介绍如下。

1 原始nos格式文件的特征剖析

PEN3电子鼻自带的上位机软件可将每次实验的测量结果保存为nos格式文件。nos格式文件的本质是文本文件,完全按照文本文件编码方式完成编码和信息储存,可借助记事本打开和查看其内容。用记事本打开PEN3电子鼻输出的nos格式文件,其信息存储排序结构由文件头、传感器响应信息记录区、文件尾等3部分组成(见图1、图2、图3)。文件头中记录了一些与实验条件相对应的仪器设置信息,如仪器版本号、采样通道数、采样间隔、采样总时长等。传感器响应信息记录区处于整个文件的中间部分,以“[Data]”字符串加上一行时间信息来标识数据记录的开始,每行信息记录一次采样结果。其中,前10列依次为10个气敏传感器的响应值,最后1列为采样时间,各列之间以空格分隔。文件尾部处于信息记录结束后空白行处,以“[Result]”标识字串开始,记录与初步分析相关的数据信息。由此可知,从PEN3电子鼻原始nos格式文件中进行信息提取的关键任务,就是从传感器响应信息记录区中抽取10个气敏传感器在各采样时间节点的响应值。

图1 文件头区域信息片断

图2 传感器响应信息记录区信息片断

图3 文件尾区域信息片断

2 信息提取方法与图形界面程序的设计

2.1 信息提取方法

通过上述原始nos格式文件分析可知,10个传感器的响应值数据处于整个文件的中间部分,因此,提取信息的首要任务便是剔除文件头与文件尾的冗余部分。去除文件头与文件尾部分可采取以下方案:

(1) 从文件中寻找一些能标识文件头结束、信息记录开始以及文件尾开始的唯一字符串。采用此方法,需设计字符匹配表达式,通过查找、匹配这些标识字符串,定位信息记录的开始与结束。

(2) 依据信息记录开始所处的行数来实现定位。此方法实现起来比较简单,仅需提取开始行与结束行中间的信息便可实现整个信息的提取。

根据图2所示区域,系统中用来表示头部结束与有用信息开始的唯一性标识字符串为:“[Data]”字符串加上一行时间信息。同样由图3可知,有用信息结束与尾部信息开始的标识字符串为“[Result]”,也具有唯一性。通过分析大量nos文件可知,传感器响应信息的开始固定在整个文件的第64行,不会因PEN3电子鼻采样参数设置不同而变化,文件头的剔除可采用从指定行开始读取的方式实现去除;传感器响应信息的结束行会因采样时间设置的不同而有所变化,因此对文件尾的去除需采用标识字符串匹配的方式。

Python pandas 数据处理工具包提供了很多高效易用的函数,处理数据极为方便,因此,应用Python语言进行程序设计。同时,鉴于excel文件比较常用,为了方便非计算机专业人员对数据的查看和调用,将信息提取后保存为excel格式文件。信息提取的具体流程如下:

(1) 分离原始nos文件的文件路径与文件名;

(2) 读入文件全部内容,按行遍历数据,先去掉换行符“ ”,再去掉前后的空格,并以空格分隔开每行数据,以列表的格式对每行数据进行暂存;

(3) 遍历步骤(2)列表中各行的数据元素,搜索、匹配信息结束标识字串“[Result]”所在的行数;

(4) 以传感器响应信息记录开始位置(即第64行)为开始,结束标识字串“[Result]”所在的行数为结束,切片提取信息数据所有行的内容;

(5) 以步骤(1)中提取到的文件名创建excel文件及sheet表,将步骤(4)得到的数据添加到表头信息中,行、列对应写入到sheet表中,并将文件保存到步骤(1)中得到的路径。具体的实现代码片段摘录如下:

import pandas as pd

import os

#name参数为要转化nos文件的路径与名称,如:"f:1.nos"。

def Start_nos_toexcel(name):

# 表头信息

header = [′R(1)′, ′R(2)′, ′R(3)′, ′R(4)′, ′R(5)′, ′R(6)′, ′R(7)′, ′R(8)′, ′R(9)′, ′R(10)′,

′预留通道1′, ′预留通道2′, ′预留通道3′, ′预留通道4′, ′预留通道5′, ′时间节点ID′]

data = [] # 存放数据

flag = 0 # 用于记录信息结束标识所在的行数

end_flag = [r′[Result]′] # 信息结束标识字串,即文件尾的开始字串

# excel文件名称及存盘路径的分离

pre1 = name.split(′.′)[0] # 分离nos文件的文件名

xlsname = (pre1 + ′.xlsx′) # 构造表格文件名称

# excel文件中创建的工作表名称

pre = os.path.split(name)

pre = pre[1].split(′.′)[0]

with open(name) as file:

for line in file: # 按行遍历文件的所有数据

line = line.strip(′ ′).strip() # 先去掉换行符 ,再去掉前后的空格

line = line.split() # 将每行数据的各列分隔开

data.append(line)

for item in data: #逐行匹配比对信息结束标字字符串“[Result]”

flag = flag + 1

if item == end_flag:

data = data[64:flag - 2] #传感器响应数据的切片提取

break

df = pd.DataFrame(data, columns=header) #构造添加表头的数据

df.to_excel(xlsname, sheet_name=pre) #保存信息数据到表格

2.2 图形界面程序

Python脚本语言程序需在Python环境下运行,对于非计算机专业人员而言存在一定的应用难度。为了同时满足非计算机专业人员的应用需求,增加了图形界面显示功能。

在图形界面设计方面,Python提供了许多优秀的工具包,如tkinter、PyQt。tkinter功能相对有限,但易于入门,使用简单;PyQt功能丰富,但入门相对较难。本次设计的图形界面软件为小型工具软件,界面设计时需遵循简洁、直观的原则。tkinter包完全能满足此设计需求,因此最终采用Python 自带的tkinter包进行图形化界面设计。

如图4所示,在PEN3电子鼻信号抽取工具图形界面上,有3个“使用说明”Label标签控件,1个“文件路径”选择 Entry控件,1个文件“浏览”Button按钮控件,1个“启动”Button按钮控件,1个“进度信息提示”Label标签控件及多个用于各功能控件分区布局的Frame子容器控件。图形界面的操作流程如下:

(1) 启动软件后,加载窗体界面及控件;

(2) 点击“浏览”按钮选择文件,获得原始文件的完整路径;

(3) 点击“启动”按钮,调用信息提取函数,依据信息提取中传入的文件路径,依次执行打开文件、信息提取、信息保存等操作;

(4) 任务完成后,通过对话框给出提示。

图4 PEN3电子鼻信号抽取工具图形界面

图形界面的代码实现方法是:导入工具包后,通过tkinter.Tk()方法使图形界面窗体实例化,并通过“self.master.maxsize(500, 350),self.master.minsize(510, 400),self.master.title(′PEN3电子鼻信号抽取工具V1.0′)”等语句指定窗口的最大值、最小值及软件标题;接着通过“tkinter.Frame()、tkinter.Label()、tkinter.Entry()、tkinter.Button()”等语句在窗口中依次创建各类控件,通过pack()或grid()方法实现各控件布局。其中,pack()方法是按控件的添加顺序自上而下完成布局;grid()方法是在指定区域按行、列形式对各控件进行布局。

以下代码片段是浏览选择原始文件模块的布局代码,其他区域的布局代码与其相似。

#在主窗体master中创建一个名为frame1的子容器:

frame1 = tkinter.Frame(self.master)

#使用pack(fill=tkinter.X)方法实现与上一子容器上下布局,并水平铺满至窗体:

frame1.pack(fill=tkinter.X)

#在子容器中创建一个Entry控件,采用grid(row=1, column=1)将其布局到子容器的1行1列:

tkinter.Entry(frame1,textvariable=self.path,width=40).grid(row=1,column=1)

#在子容器中创建一个Button控件,采用grid(row=1, column=3)将其布局到子容器的1行3列:

tkinter.Button(frame1,text="浏览",width=10,height=1,command=self.selectPath).grid(row=1,column=3)

文件路径通过tkinter的filedialog.askopenfilenames()进行筛选,实现语句是:

self.path_ = filedialog.askopenfilenames(filetypes=("PEN3 file", "*.nos*"))

其中,filetypes=("PEN3 file", "*.nos*")用于指定输入文件类型为PEN3电子鼻的nos格式文件。

各按钮控件的功能通过command参数绑定功能函数来实现,如“启动”按钮的实现语句是:

self.run = tkinter.Button(frame4, text=′启动′, width=10, height=1, command=self.Start_nos_toexcel)

其中,frame4用于指定按钮布局的子容器;text=′启动′参数用于指定按钮上显示的文本;width=10与 height=1用于设置按钮的大小;command=self.Start_nos_toexcel用于指定按钮按下后将要执行的功能,其函数为:self.Start_nos_toexcel。

提示任务完成对话框通过tkinter的messagebox()方法实现,具体实现语句为:

messagebox.showinfo(′Success′, ′任务完成′)

3 程序打包与测试

为了使所设计的工具软件能够脱离Python环境而实现跨平台运行,需将其打包为exe格式可执行文件。鉴于当前用户大多使用微软公司的Windows 7或Windows 10操作系统,因此将设计的图形界面软件打包为可脱离Python环境、运行于Windows 7或Windows 10操作系统的可执行文件。在Python环境下,通常应用pyinstaller模块实现程序的打包输出[9-10]。具体的实现方法是:在CMD命令提示行模式下,进入要打包输出文件所在的目录,执行pyinstaller -F -w yourfilename.py 命令,将其打包成可脱离Python环境、独立无包依赖的exe可执行文件。

为了验证程序的可靠性与稳定性,将已打包的exe可执行文件分别在Windows 7与Win10-64位机操作系统中运行,应用多个不同实验参数下获得的PEN3电子鼻nos文件进行测试。测试结果显示,该软件能够正确提取每个文件中10个传感器的响应值数据,并能将数据正确存储于excel文件中。所有测试文件的运行结果界面与图5、图6相似。在CPU型号为Intel(R) Core(TM) i3-4160- 3.6 GHz,内存为4 GiB,操作系统为Win7-64位的宏机台式机上,对采样点数为100的nos文件进行了信息提取,平均耗时约20 ms。

图5 PEN3电子鼻信号抽取工具运行结果界面

4 结 语

本次研究中,基于Python中的tkinter包设计了一款PEN3电子鼻nos文件信息提取工具,并通过pyinstaller模块将其打包为可在Windows 7与Win10- 64位机操作系统中脱机运行的exe可执行文件。用不同采集参数下的PEN3电子鼻nos文件进行了测试,结果表明此工具软件运行稳定可靠,高效易用。此工具软件为非计算机专业科研工作人员整理数据提供了便利,在一定程度上提高了工作效率,降低了人工整理数据出错的概率。不足之处是,此工具软件每次仅能处理1个nos文件,后续版本有待改进以便实现多文件处理。

图6 生成excel格式文件片段

猜你喜欢

格式文件电子鼻控件
基于电子鼻的肺癌无创检测研究
基于WebGL的轨道交通BIM轻量化应用方案
关于RAW格式文件,我们需要知道些什么?
相机学院
基于.net的用户定义验证控件的应用分析
电子鼻咽喉镜在腔镜甲状腺手术前的应用
关于.net控件数组的探讨
香辛料识别中电子鼻采集及算法研究
飞到火星去“闻味儿”——神奇的电子鼻
回归基础 到底什么是RAW格式文件?