張喜紅 王玉香
(亳州職業(yè)技術(shù)學(xué)院, 安徽 亳州 236800)
隨著傳感器檢測(cè)技術(shù)與模式識(shí)別等技術(shù)的進(jìn)步,感官仿生設(shè)備得到了長(zhǎng)足的發(fā)展[1-2]。電子鼻是一種模擬人體嗅覺(jué)的感官仿生設(shè)備,是感官仿生設(shè)備的典型代表之一。近年來(lái)電子鼻在環(huán)境檢測(cè)、食品檢驗(yàn)、中藥材品鑒等方面應(yīng)用中取得了可喜成績(jī),引起眾多學(xué)者的關(guān)注[3-4]。德國(guó)AIRSENSE公司生產(chǎn)的PEN3電子鼻,因其小巧便攜、測(cè)量快捷的優(yōu)勢(shì),幾乎成為國(guó)內(nèi)開(kāi)展仿生嗅覺(jué)研究的首選設(shè)備[5-6]。PEN3電子鼻系統(tǒng)自帶上位機(jī)數(shù)據(jù)分析軟件,內(nèi)置多種常用數(shù)據(jù)分析算法(如判別分析LDA、主成份分析PCA),基本能夠滿足數(shù)據(jù)分析需求。
然而,面對(duì)大數(shù)據(jù)分析,PEN3電子鼻系統(tǒng)上位機(jī)內(nèi)置的常用統(tǒng)計(jì)分析方法略有不足,無(wú)法充分滿足實(shí)際需求;同時(shí),與其他數(shù)據(jù)分析平臺(tái)相比,PEN3電子鼻自帶的數(shù)據(jù)分析軟件在數(shù)據(jù)可視化方面也有不足;此外,PEN3電子鼻測(cè)量時(shí)所采集的數(shù)據(jù)以nos格式文件存儲(chǔ),不能直接導(dǎo)出以供第三方數(shù)據(jù)分析平臺(tái)應(yīng)用,需耗費(fèi)人力進(jìn)行整理,效率低下,錯(cuò)誤率高。Python腳本語(yǔ)言易學(xué)易用、簡(jiǎn)潔高效,且提供了大量開(kāi)源的數(shù)據(jù)分析及處理工具包,被稱作數(shù)據(jù)分析和辦公自動(dòng)化的膠水語(yǔ)言,既能用于編寫(xiě)開(kāi)發(fā)后臺(tái)運(yùn)行的腳本程序,又可用于編寫(xiě)圖形界面程序[7-8]。
本次研究中,我們基于Python tkinter設(shè)計(jì)了一款能快速提取和整理PEN3電子鼻傳感器測(cè)量數(shù)據(jù)的工具軟件,具體的設(shè)計(jì)思路及方法介紹如下。
PEN3電子鼻自帶的上位機(jī)軟件可將每次實(shí)驗(yàn)的測(cè)量結(jié)果保存為nos格式文件。nos格式文件的本質(zhì)是文本文件,完全按照文本文件編碼方式完成編碼和信息儲(chǔ)存,可借助記事本打開(kāi)和查看其內(nèi)容。用記事本打開(kāi)PEN3電子鼻輸出的nos格式文件,其信息存儲(chǔ)排序結(jié)構(gòu)由文件頭、傳感器響應(yīng)信息記錄區(qū)、文件尾等3部分組成(見(jiàn)圖1、圖2、圖3)。文件頭中記錄了一些與實(shí)驗(yàn)條件相對(duì)應(yīng)的儀器設(shè)置信息,如儀器版本號(hào)、采樣通道數(shù)、采樣間隔、采樣總時(shí)長(zhǎng)等。傳感器響應(yīng)信息記錄區(qū)處于整個(gè)文件的中間部分,以“[Data]”字符串加上一行時(shí)間信息來(lái)標(biāo)識(shí)數(shù)據(jù)記錄的開(kāi)始,每行信息記錄一次采樣結(jié)果。其中,前10列依次為10個(gè)氣敏傳感器的響應(yīng)值,最后1列為采樣時(shí)間,各列之間以空格分隔。文件尾部處于信息記錄結(jié)束后空白行處,以“[Result]”標(biāo)識(shí)字串開(kāi)始,記錄與初步分析相關(guān)的數(shù)據(jù)信息。由此可知,從PEN3電子鼻原始nos格式文件中進(jìn)行信息提取的關(guān)鍵任務(wù),就是從傳感器響應(yīng)信息記錄區(qū)中抽取10個(gè)氣敏傳感器在各采樣時(shí)間節(jié)點(diǎn)的響應(yīng)值。
圖1 文件頭區(qū)域信息片斷
圖2 傳感器響應(yīng)信息記錄區(qū)信息片斷
圖3 文件尾區(qū)域信息片斷
通過(guò)上述原始nos格式文件分析可知,10個(gè)傳感器的響應(yīng)值數(shù)據(jù)處于整個(gè)文件的中間部分,因此,提取信息的首要任務(wù)便是剔除文件頭與文件尾的冗余部分。去除文件頭與文件尾部分可采取以下方案:
(1) 從文件中尋找一些能標(biāo)識(shí)文件頭結(jié)束、信息記錄開(kāi)始以及文件尾開(kāi)始的唯一字符串。采用此方法,需設(shè)計(jì)字符匹配表達(dá)式,通過(guò)查找、匹配這些標(biāo)識(shí)字符串,定位信息記錄的開(kāi)始與結(jié)束。
(2) 依據(jù)信息記錄開(kāi)始所處的行數(shù)來(lái)實(shí)現(xiàn)定位。此方法實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,僅需提取開(kāi)始行與結(jié)束行中間的信息便可實(shí)現(xiàn)整個(gè)信息的提取。
根據(jù)圖2所示區(qū)域,系統(tǒng)中用來(lái)表示頭部結(jié)束與有用信息開(kāi)始的唯一性標(biāo)識(shí)字符串為:“[Data]”字符串加上一行時(shí)間信息。同樣由圖3可知,有用信息結(jié)束與尾部信息開(kāi)始的標(biāo)識(shí)字符串為“[Result]”,也具有唯一性。通過(guò)分析大量nos文件可知,傳感器響應(yīng)信息的開(kāi)始固定在整個(gè)文件的第64行,不會(huì)因PEN3電子鼻采樣參數(shù)設(shè)置不同而變化,文件頭的剔除可采用從指定行開(kāi)始讀取的方式實(shí)現(xiàn)去除;傳感器響應(yīng)信息的結(jié)束行會(huì)因采樣時(shí)間設(shè)置的不同而有所變化,因此對(duì)文件尾的去除需采用標(biāo)識(shí)字符串匹配的方式。
Python pandas 數(shù)據(jù)處理工具包提供了很多高效易用的函數(shù),處理數(shù)據(jù)極為方便,因此,應(yīng)用Python語(yǔ)言進(jìn)行程序設(shè)計(jì)。同時(shí),鑒于excel文件比較常用,為了方便非計(jì)算機(jī)專業(yè)人員對(duì)數(shù)據(jù)的查看和調(diào)用,將信息提取后保存為excel格式文件。信息提取的具體流程如下:
(1) 分離原始nos文件的文件路徑與文件名;
(2) 讀入文件全部?jī)?nèi)容,按行遍歷數(shù)據(jù),先去掉換行符“ ”,再去掉前后的空格,并以空格分隔開(kāi)每行數(shù)據(jù),以列表的格式對(duì)每行數(shù)據(jù)進(jìn)行暫存;
(3) 遍歷步驟(2)列表中各行的數(shù)據(jù)元素,搜索、匹配信息結(jié)束標(biāo)識(shí)字串“[Result]”所在的行數(shù);
(4) 以傳感器響應(yīng)信息記錄開(kāi)始位置(即第64行)為開(kāi)始,結(jié)束標(biāo)識(shí)字串“[Result]”所在的行數(shù)為結(jié)束,切片提取信息數(shù)據(jù)所有行的內(nèi)容;
(5) 以步驟(1)中提取到的文件名創(chuàng)建excel文件及sheet表,將步驟(4)得到的數(shù)據(jù)添加到表頭信息中,行、列對(duì)應(yīng)寫(xiě)入到sheet表中,并將文件保存到步驟(1)中得到的路徑。具體的實(shí)現(xiàn)代碼片段摘錄如下:
import pandas as pd
import os
#name參數(shù)為要轉(zhuǎn)化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)′,
′預(yù)留通道1′, ′預(yù)留通道2′, ′預(yù)留通道3′, ′預(yù)留通道4′, ′預(yù)留通道5′, ′時(shí)間節(jié)點(diǎn)ID′]
data = [] # 存放數(shù)據(jù)
flag = 0 # 用于記錄信息結(jié)束標(biāo)識(shí)所在的行數(shù)
end_flag = [r′[Result]′] # 信息結(jié)束標(biāo)識(shí)字串,即文件尾的開(kāi)始字串
# excel文件名稱及存盤(pán)路徑的分離
pre1 = name.split(′.′)[0] # 分離nos文件的文件名
xlsname = (pre1 + ′.xlsx′) # 構(gòu)造表格文件名稱
# excel文件中創(chuàng)建的工作表名稱
pre = os.path.split(name)
pre = pre[1].split(′.′)[0]
with open(name) as file:
for line in file: # 按行遍歷文件的所有數(shù)據(jù)
line = line.strip(′ ′).strip() # 先去掉換行符 ,再去掉前后的空格
line = line.split() # 將每行數(shù)據(jù)的各列分隔開(kāi)
data.append(line)
for item in data: #逐行匹配比對(duì)信息結(jié)束標(biāo)字字符串“[Result]”
flag = flag + 1
if item == end_flag:
data = data[64:flag - 2] #傳感器響應(yīng)數(shù)據(jù)的切片提取
break
df = pd.DataFrame(data, columns=header) #構(gòu)造添加表頭的數(shù)據(jù)
df.to_excel(xlsname, sheet_name=pre) #保存信息數(shù)據(jù)到表格
Python腳本語(yǔ)言程序需在Python環(huán)境下運(yùn)行,對(duì)于非計(jì)算機(jī)專業(yè)人員而言存在一定的應(yīng)用難度。為了同時(shí)滿足非計(jì)算機(jī)專業(yè)人員的應(yīng)用需求,增加了圖形界面顯示功能。
在圖形界面設(shè)計(jì)方面,Python提供了許多優(yōu)秀的工具包,如tkinter、PyQt。tkinter功能相對(duì)有限,但易于入門(mén),使用簡(jiǎn)單;PyQt功能豐富,但入門(mén)相對(duì)較難。本次設(shè)計(jì)的圖形界面軟件為小型工具軟件,界面設(shè)計(jì)時(shí)需遵循簡(jiǎn)潔、直觀的原則。tkinter包完全能滿足此設(shè)計(jì)需求,因此最終采用Python 自帶的tkinter包進(jìn)行圖形化界面設(shè)計(jì)。
如圖4所示,在PEN3電子鼻信號(hào)抽取工具圖形界面上,有3個(gè)“使用說(shuō)明”Label標(biāo)簽控件,1個(gè)“文件路徑”選擇 Entry控件,1個(gè)文件“瀏覽”Button按鈕控件,1個(gè)“啟動(dòng)”Button按鈕控件,1個(gè)“進(jìn)度信息提示”Label標(biāo)簽控件及多個(gè)用于各功能控件分區(qū)布局的Frame子容器控件。圖形界面的操作流程如下:
(1) 啟動(dòng)軟件后,加載窗體界面及控件;
(2) 點(diǎn)擊“瀏覽”按鈕選擇文件,獲得原始文件的完整路徑;
(3) 點(diǎn)擊“啟動(dòng)”按鈕,調(diào)用信息提取函數(shù),依據(jù)信息提取中傳入的文件路徑,依次執(zhí)行打開(kāi)文件、信息提取、信息保存等操作;
(4) 任務(wù)完成后,通過(guò)對(duì)話框給出提示。
圖4 PEN3電子鼻信號(hào)抽取工具圖形界面
圖形界面的代碼實(shí)現(xiàn)方法是:導(dǎo)入工具包后,通過(guò)tkinter.Tk()方法使圖形界面窗體實(shí)例化,并通過(guò)“self.master.maxsize(500, 350),self.master.minsize(510, 400),self.master.title(′PEN3電子鼻信號(hào)抽取工具V1.0′)”等語(yǔ)句指定窗口的最大值、最小值及軟件標(biāo)題;接著通過(guò)“tkinter.Frame()、tkinter.Label()、tkinter.Entry()、tkinter.Button()”等語(yǔ)句在窗口中依次創(chuàng)建各類控件,通過(guò)pack()或grid()方法實(shí)現(xiàn)各控件布局。其中,pack()方法是按控件的添加順序自上而下完成布局;grid()方法是在指定區(qū)域按行、列形式對(duì)各控件進(jìn)行布局。
以下代碼片段是瀏覽選擇原始文件模塊的布局代碼,其他區(qū)域的布局代碼與其相似。
#在主窗體master中創(chuàng)建一個(gè)名為frame1的子容器:
frame1 = tkinter.Frame(self.master)
#使用pack(fill=tkinter.X)方法實(shí)現(xiàn)與上一子容器上下布局,并水平鋪滿至窗體:
frame1.pack(fill=tkinter.X)
#在子容器中創(chuàng)建一個(gè)Entry控件,采用grid(row=1, column=1)將其布局到子容器的1行1列:
tkinter.Entry(frame1,textvariable=self.path,width=40).grid(row=1,column=1)
#在子容器中創(chuàng)建一個(gè)Button控件,采用grid(row=1, column=3)將其布局到子容器的1行3列:
tkinter.Button(frame1,text="瀏覽",width=10,height=1,command=self.selectPath).grid(row=1,column=3)
文件路徑通過(guò)tkinter的filedialog.askopenfilenames()進(jìn)行篩選,實(shí)現(xiàn)語(yǔ)句是:
self.path_ = filedialog.askopenfilenames(filetypes=("PEN3 file", "*.nos*"))
其中,filetypes=("PEN3 file", "*.nos*")用于指定輸入文件類型為PEN3電子鼻的nos格式文件。
各按鈕控件的功能通過(guò)command參數(shù)綁定功能函數(shù)來(lái)實(shí)現(xiàn),如“啟動(dòng)”按鈕的實(shí)現(xiàn)語(yǔ)句是:
self.run = tkinter.Button(frame4, text=′啟動(dòng)′, width=10, height=1, command=self.Start_nos_toexcel)
其中,frame4用于指定按鈕布局的子容器;text=′啟動(dòng)′參數(shù)用于指定按鈕上顯示的文本;width=10與 height=1用于設(shè)置按鈕的大小;command=self.Start_nos_toexcel用于指定按鈕按下后將要執(zhí)行的功能,其函數(shù)為:self.Start_nos_toexcel。
提示任務(wù)完成對(duì)話框通過(guò)tkinter的messagebox()方法實(shí)現(xiàn),具體實(shí)現(xiàn)語(yǔ)句為:
messagebox.showinfo(′Success′, ′任務(wù)完成′)
為了使所設(shè)計(jì)的工具軟件能夠脫離Python環(huán)境而實(shí)現(xiàn)跨平臺(tái)運(yùn)行,需將其打包為exe格式可執(zhí)行文件。鑒于當(dāng)前用戶大多使用微軟公司的Windows 7或Windows 10操作系統(tǒng),因此將設(shè)計(jì)的圖形界面軟件打包為可脫離Python環(huán)境、運(yùn)行于Windows 7或Windows 10操作系統(tǒng)的可執(zhí)行文件。在Python環(huán)境下,通常應(yīng)用pyinstaller模塊實(shí)現(xiàn)程序的打包輸出[9-10]。具體的實(shí)現(xiàn)方法是:在CMD命令提示行模式下,進(jìn)入要打包輸出文件所在的目錄,執(zhí)行pyinstaller -F -w yourfilename.py 命令,將其打包成可脫離Python環(huán)境、獨(dú)立無(wú)包依賴的exe可執(zhí)行文件。
為了驗(yàn)證程序的可靠性與穩(wěn)定性,將已打包的exe可執(zhí)行文件分別在Windows 7與Win10-64位機(jī)操作系統(tǒng)中運(yùn)行,應(yīng)用多個(gè)不同實(shí)驗(yàn)參數(shù)下獲得的PEN3電子鼻nos文件進(jìn)行測(cè)試。測(cè)試結(jié)果顯示,該軟件能夠正確提取每個(gè)文件中10個(gè)傳感器的響應(yīng)值數(shù)據(jù),并能將數(shù)據(jù)正確存儲(chǔ)于excel文件中。所有測(cè)試文件的運(yùn)行結(jié)果界面與圖5、圖6相似。在CPU型號(hào)為Intel(R) Core(TM) i3-4160- 3.6 GHz,內(nèi)存為4 GiB,操作系統(tǒng)為Win7-64位的宏機(jī)臺(tái)式機(jī)上,對(duì)采樣點(diǎn)數(shù)為100的nos文件進(jìn)行了信息提取,平均耗時(shí)約20 ms。
圖5 PEN3電子鼻信號(hào)抽取工具運(yùn)行結(jié)果界面
本次研究中,基于Python中的tkinter包設(shè)計(jì)了一款PEN3電子鼻nos文件信息提取工具,并通過(guò)pyinstaller模塊將其打包為可在Windows 7與Win10- 64位機(jī)操作系統(tǒng)中脫機(jī)運(yùn)行的exe可執(zhí)行文件。用不同采集參數(shù)下的PEN3電子鼻nos文件進(jìn)行了測(cè)試,結(jié)果表明此工具軟件運(yùn)行穩(wěn)定可靠,高效易用。此工具軟件為非計(jì)算機(jī)專業(yè)科研工作人員整理數(shù)據(jù)提供了便利,在一定程度上提高了工作效率,降低了人工整理數(shù)據(jù)出錯(cuò)的概率。不足之處是,此工具軟件每次僅能處理1個(gè)nos文件,后續(xù)版本有待改進(jìn)以便實(shí)現(xiàn)多文件處理。
圖6 生成excel格式文件片段
重慶科技學(xué)院學(xué)報(bào)(自然科學(xué)版)2019年6期