国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Python的PEN3電子鼻nos文件關(guān)鍵信息自動提取工具設(shè)計

2019-02-11 07:05張喜紅王玉香
關(guān)鍵詞:格式文件電子鼻控件

張喜紅 王玉香

(亳州職業(yè)技術(shù)學(xué)院, 安徽 亳州 236800)

隨著傳感器檢測技術(shù)與模式識別等技術(shù)的進(jìn)步,感官仿生設(shè)備得到了長足的發(fā)展[1-2]。電子鼻是一種模擬人體嗅覺的感官仿生設(shè)備,是感官仿生設(shè)備的典型代表之一。近年來電子鼻在環(huán)境檢測、食品檢驗(yàn)、中藥材品鑒等方面應(yīng)用中取得了可喜成績,引起眾多學(xué)者的關(guān)注[3-4]。德國AIRSENSE公司生產(chǎn)的PEN3電子鼻,因其小巧便攜、測量快捷的優(yōu)勢,幾乎成為國內(nèi)開展仿生嗅覺研究的首選設(shè)備[5-6]。PEN3電子鼻系統(tǒng)自帶上位機(jī)數(shù)據(jù)分析軟件,內(nèi)置多種常用數(shù)據(jù)分析算法(如判別分析LDA、主成份分析PCA),基本能夠滿足數(shù)據(jù)分析需求。

然而,面對大數(shù)據(jù)分析,PEN3電子鼻系統(tǒng)上位機(jī)內(nèi)置的常用統(tǒng)計分析方法略有不足,無法充分滿足實(shí)際需求;同時,與其他數(shù)據(jù)分析平臺相比,PEN3電子鼻自帶的數(shù)據(jù)分析軟件在數(shù)據(jù)可視化方面也有不足;此外,PEN3電子鼻測量時所采集的數(shù)據(jù)以nos格式文件存儲,不能直接導(dǎo)出以供第三方數(shù)據(jù)分析平臺應(yīng)用,需耗費(fèi)人力進(jìn)行整理,效率低下,錯誤率高。Python腳本語言易學(xué)易用、簡潔高效,且提供了大量開源的數(shù)據(jù)分析及處理工具包,被稱作數(shù)據(jù)分析和辦公自動化的膠水語言,既能用于編寫開發(fā)后臺運(yùn)行的腳本程序,又可用于編寫圖形界面程序[7-8]。

本次研究中,我們基于Python tkinter設(shè)計了一款能快速提取和整理PEN3電子鼻傳感器測量數(shù)據(jù)的工具軟件,具體的設(shè)計思路及方法介紹如下。

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

PEN3電子鼻自帶的上位機(jī)軟件可將每次實(shí)驗(yàn)的測量結(jié)果保存為nos格式文件。nos格式文件的本質(zhì)是文本文件,完全按照文本文件編碼方式完成編碼和信息儲存,可借助記事本打開和查看其內(nèi)容。用記事本打開PEN3電子鼻輸出的nos格式文件,其信息存儲排序結(jié)構(gòu)由文件頭、傳感器響應(yīng)信息記錄區(qū)、文件尾等3部分組成(見圖1、圖2、圖3)。文件頭中記錄了一些與實(shí)驗(yàn)條件相對應(yīng)的儀器設(shè)置信息,如儀器版本號、采樣通道數(shù)、采樣間隔、采樣總時長等。傳感器響應(yīng)信息記錄區(qū)處于整個文件的中間部分,以“[Data]”字符串加上一行時間信息來標(biāo)識數(shù)據(jù)記錄的開始,每行信息記錄一次采樣結(jié)果。其中,前10列依次為10個氣敏傳感器的響應(yīng)值,最后1列為采樣時間,各列之間以空格分隔。文件尾部處于信息記錄結(jié)束后空白行處,以“[Result]”標(biāo)識字串開始,記錄與初步分析相關(guān)的數(shù)據(jù)信息。由此可知,從PEN3電子鼻原始nos格式文件中進(jìn)行信息提取的關(guān)鍵任務(wù),就是從傳感器響應(yīng)信息記錄區(qū)中抽取10個氣敏傳感器在各采樣時間節(jié)點(diǎn)的響應(yīng)值。

圖1 文件頭區(qū)域信息片斷

圖2 傳感器響應(yīng)信息記錄區(qū)信息片斷

圖3 文件尾區(qū)域信息片斷

2 信息提取方法與圖形界面程序的設(shè)計

2.1 信息提取方法

通過上述原始nos格式文件分析可知,10個傳感器的響應(yīng)值數(shù)據(jù)處于整個文件的中間部分,因此,提取信息的首要任務(wù)便是剔除文件頭與文件尾的冗余部分。去除文件頭與文件尾部分可采取以下方案:

(1) 從文件中尋找一些能標(biāo)識文件頭結(jié)束、信息記錄開始以及文件尾開始的唯一字符串。采用此方法,需設(shè)計字符匹配表達(dá)式,通過查找、匹配這些標(biāo)識字符串,定位信息記錄的開始與結(jié)束。

(2) 依據(jù)信息記錄開始所處的行數(shù)來實(shí)現(xiàn)定位。此方法實(shí)現(xiàn)起來比較簡單,僅需提取開始行與結(jié)束行中間的信息便可實(shí)現(xiàn)整個信息的提取。

根據(jù)圖2所示區(qū)域,系統(tǒng)中用來表示頭部結(jié)束與有用信息開始的唯一性標(biāo)識字符串為:“[Data]”字符串加上一行時間信息。同樣由圖3可知,有用信息結(jié)束與尾部信息開始的標(biāo)識字符串為“[Result]”,也具有唯一性。通過分析大量nos文件可知,傳感器響應(yīng)信息的開始固定在整個文件的第64行,不會因PEN3電子鼻采樣參數(shù)設(shè)置不同而變化,文件頭的剔除可采用從指定行開始讀取的方式實(shí)現(xiàn)去除;傳感器響應(yīng)信息的結(jié)束行會因采樣時間設(shè)置的不同而有所變化,因此對文件尾的去除需采用標(biāo)識字符串匹配的方式。

Python pandas 數(shù)據(jù)處理工具包提供了很多高效易用的函數(shù),處理數(shù)據(jù)極為方便,因此,應(yīng)用Python語言進(jìn)行程序設(shè)計。同時,鑒于excel文件比較常用,為了方便非計算機(jī)專業(yè)人員對數(shù)據(jù)的查看和調(diào)用,將信息提取后保存為excel格式文件。信息提取的具體流程如下:

(1) 分離原始nos文件的文件路徑與文件名;

(2) 讀入文件全部內(nèi)容,按行遍歷數(shù)據(jù),先去掉換行符“ ”,再去掉前后的空格,并以空格分隔開每行數(shù)據(jù),以列表的格式對每行數(shù)據(jù)進(jìn)行暫存;

(3) 遍歷步驟(2)列表中各行的數(shù)據(jù)元素,搜索、匹配信息結(jié)束標(biāo)識字串“[Result]”所在的行數(shù);

(4) 以傳感器響應(yīng)信息記錄開始位置(即第64行)為開始,結(jié)束標(biāo)識字串“[Result]”所在的行數(shù)為結(jié)束,切片提取信息數(shù)據(jù)所有行的內(nèi)容;

(5) 以步驟(1)中提取到的文件名創(chuàng)建excel文件及sheet表,將步驟(4)得到的數(shù)據(jù)添加到表頭信息中,行、列對應(yīng)寫入到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′, ′時間節(jié)點(diǎn)ID′]

data = [] # 存放數(shù)據(jù)

flag = 0 # 用于記錄信息結(jié)束標(biāo)識所在的行數(shù)

end_flag = [r′[Result]′] # 信息結(jié)束標(biāo)識字串,即文件尾的開始字串

# excel文件名稱及存盤路徑的分離

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ù)的各列分隔開

data.append(line)

for item in data: #逐行匹配比對信息結(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ù)到表格

2.2 圖形界面程序

Python腳本語言程序需在Python環(huán)境下運(yùn)行,對于非計算機(jī)專業(yè)人員而言存在一定的應(yīng)用難度。為了同時滿足非計算機(jī)專業(yè)人員的應(yīng)用需求,增加了圖形界面顯示功能。

在圖形界面設(shè)計方面,Python提供了許多優(yōu)秀的工具包,如tkinter、PyQt。tkinter功能相對有限,但易于入門,使用簡單;PyQt功能豐富,但入門相對較難。本次設(shè)計的圖形界面軟件為小型工具軟件,界面設(shè)計時需遵循簡潔、直觀的原則。tkinter包完全能滿足此設(shè)計需求,因此最終采用Python 自帶的tkinter包進(jìn)行圖形化界面設(shè)計。

如圖4所示,在PEN3電子鼻信號抽取工具圖形界面上,有3個“使用說明”Label標(biāo)簽控件,1個“文件路徑”選擇 Entry控件,1個文件“瀏覽”Button按鈕控件,1個“啟動”Button按鈕控件,1個“進(jìn)度信息提示”Label標(biāo)簽控件及多個用于各功能控件分區(qū)布局的Frame子容器控件。圖形界面的操作流程如下:

(1) 啟動軟件后,加載窗體界面及控件;

(2) 點(diǎn)擊“瀏覽”按鈕選擇文件,獲得原始文件的完整路徑;

(3) 點(diǎn)擊“啟動”按鈕,調(diào)用信息提取函數(shù),依據(jù)信息提取中傳入的文件路徑,依次執(zhí)行打開文件、信息提取、信息保存等操作;

(4) 任務(wù)完成后,通過對話框給出提示。

圖4 PEN3電子鼻信號抽取工具圖形界面

圖形界面的代碼實(shí)現(xiàn)方法是:導(dǎo)入工具包后,通過tkinter.Tk()方法使圖形界面窗體實(shí)例化,并通過“self.master.maxsize(500, 350),self.master.minsize(510, 400),self.master.title(′PEN3電子鼻信號抽取工具V1.0′)”等語句指定窗口的最大值、最小值及軟件標(biāo)題;接著通過“tkinter.Frame()、tkinter.Label()、tkinter.Entry()、tkinter.Button()”等語句在窗口中依次創(chuàng)建各類控件,通過pack()或grid()方法實(shí)現(xiàn)各控件布局。其中,pack()方法是按控件的添加順序自上而下完成布局;grid()方法是在指定區(qū)域按行、列形式對各控件進(jìn)行布局。

以下代碼片段是瀏覽選擇原始文件模塊的布局代碼,其他區(qū)域的布局代碼與其相似。

#在主窗體master中創(chuàng)建一個名為frame1的子容器:

frame1 = tkinter.Frame(self.master)

#使用pack(fill=tkinter.X)方法實(shí)現(xiàn)與上一子容器上下布局,并水平鋪滿至窗體:

frame1.pack(fill=tkinter.X)

#在子容器中創(chuàng)建一個Entry控件,采用grid(row=1, column=1)將其布局到子容器的1行1列:

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

#在子容器中創(chuàng)建一個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()進(jìn)行篩選,實(shí)現(xiàn)語句是:

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

其中,filetypes=("PEN3 file", "*.nos*")用于指定輸入文件類型為PEN3電子鼻的nos格式文件。

各按鈕控件的功能通過command參數(shù)綁定功能函數(shù)來實(shí)現(xiàn),如“啟動”按鈕的實(shí)現(xiàn)語句是:

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

其中,frame4用于指定按鈕布局的子容器;text=′啟動′參數(shù)用于指定按鈕上顯示的文本;width=10與 height=1用于設(shè)置按鈕的大小;command=self.Start_nos_toexcel用于指定按鈕按下后將要執(zhí)行的功能,其函數(shù)為:self.Start_nos_toexcel。

提示任務(wù)完成對話框通過tkinter的messagebox()方法實(shí)現(xiàn),具體實(shí)現(xiàn)語句為:

messagebox.showinfo(′Success′, ′任務(wù)完成′)

3 程序打包與測試

為了使所設(shè)計的工具軟件能夠脫離Python環(huán)境而實(shí)現(xiàn)跨平臺運(yùn)行,需將其打包為exe格式可執(zhí)行文件。鑒于當(dāng)前用戶大多使用微軟公司的Windows 7或Windows 10操作系統(tǒng),因此將設(shè)計的圖形界面軟件打包為可脫離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ú)立無包依賴的exe可執(zhí)行文件。

為了驗(yàn)證程序的可靠性與穩(wěn)定性,將已打包的exe可執(zhí)行文件分別在Windows 7與Win10-64位機(jī)操作系統(tǒng)中運(yùn)行,應(yīng)用多個不同實(shí)驗(yàn)參數(shù)下獲得的PEN3電子鼻nos文件進(jìn)行測試。測試結(jié)果顯示,該軟件能夠正確提取每個文件中10個傳感器的響應(yīng)值數(shù)據(jù),并能將數(shù)據(jù)正確存儲于excel文件中。所有測試文件的運(yùn)行結(jié)果界面與圖5、圖6相似。在CPU型號為Intel(R) Core(TM) i3-4160- 3.6 GHz,內(nèi)存為4 GiB,操作系統(tǒng)為Win7-64位的宏機(jī)臺式機(jī)上,對采樣點(diǎn)數(shù)為100的nos文件進(jìn)行了信息提取,平均耗時約20 ms。

圖5 PEN3電子鼻信號抽取工具運(yùn)行結(jié)果界面

4 結(jié) 語

本次研究中,基于Python中的tkinter包設(shè)計了一款PEN3電子鼻nos文件信息提取工具,并通過pyinstaller模塊將其打包為可在Windows 7與Win10- 64位機(jī)操作系統(tǒng)中脫機(jī)運(yùn)行的exe可執(zhí)行文件。用不同采集參數(shù)下的PEN3電子鼻nos文件進(jìn)行了測試,結(jié)果表明此工具軟件運(yùn)行穩(wěn)定可靠,高效易用。此工具軟件為非計算機(jī)專業(yè)科研工作人員整理數(shù)據(jù)提供了便利,在一定程度上提高了工作效率,降低了人工整理數(shù)據(jù)出錯的概率。不足之處是,此工具軟件每次僅能處理1個nos文件,后續(xù)版本有待改進(jìn)以便實(shí)現(xiàn)多文件處理。

圖6 生成excel格式文件片段

猜你喜歡
格式文件電子鼻控件
基于電子鼻的肺癌無創(chuàng)檢測研究
基于WebGL的軌道交通BIM輕量化應(yīng)用方案
關(guān)于RAW格式文件,我們需要知道些什么?
相機(jī)學(xué)院
基于.net的用戶定義驗(yàn)證控件的應(yīng)用分析
電子鼻咽喉鏡在腔鏡甲狀腺手術(shù)前的應(yīng)用
關(guān)于.net控件數(shù)組的探討
香辛料識別中電子鼻采集及算法研究
飛到火星去“聞味兒”——神奇的電子鼻
回歸基礎(chǔ) 到底什么是RAW格式文件?