摘要:隨著信息化的發(fā)展,數(shù)據(jù)存儲變得更加靈活多樣,數(shù)據(jù)處理的需求也日益增長。在兩個數(shù)據(jù)表格間進行數(shù)據(jù)匹配查找時,常規(guī)方法是采用VLOOKUP()等關聯(lián)匹配類函數(shù)。然而,當表格數(shù)量較多、操作頻繁時,這種方式效率較低。為解決這一問題,文章基于Python語言,利用pandas、PyQt5等生態(tài)庫,設計了一套表格數(shù)據(jù)自動化查找系統(tǒng)。該系統(tǒng)大大提高了數(shù)據(jù)查找、對比、提取的效率和準確性,降低了從業(yè)人員的工作強度。
關鍵詞:Python;PyQt5;pandas;表格數(shù)據(jù)對比;數(shù)據(jù)查找
中圖分類號:TP311 文獻標識碼:A
文章編號:1009-3044(2024)31-0051-03
開放科學(資源服務)標識碼(OSID) :
0 引言
在表格數(shù)據(jù)查找應用中,傳統(tǒng)方式是使用VLOOKUP()等關聯(lián)匹配函數(shù)[1-2]。低頻操作時,這是一種高效的處理方式。但當文件數(shù)量多且操作頻繁時,大量調用匹配函數(shù)和設置參數(shù)會降低效率。為解決上述問題,本文基于Python及其生態(tài)庫,開發(fā)了一款靈活、友好的表格數(shù)據(jù)查找系統(tǒng)。該系統(tǒng)能夠快速實現(xiàn)跨表數(shù)據(jù)查找和目標數(shù)據(jù)提取。
1 技術方案簡介
本系統(tǒng)采用Python編程環(huán)境實現(xiàn)基本邏輯處理,通過pandas庫讀取表格數(shù)據(jù),再利用PyQt5開發(fā)GUI (圖形用戶界面)進行數(shù)據(jù)展示及人機交互。技術架構如圖1所示:
Python是一種跨平臺、開源、免費的解釋型高級編程語言,功能強大。它能夠輕松地將其他語言制作的模塊聯(lián)結在一起,在Web編程、圖形處理、大數(shù)據(jù)處理、科學計算等領域都有廣泛應用[3-4]。作為數(shù)據(jù)分析的主要工具之一,pandas是Python環(huán)境中用于數(shù)據(jù)處理和分析的框架庫。該庫為序列數(shù)據(jù)和表數(shù)據(jù)的存儲提供了快速、靈活、明確的數(shù)據(jù)結構,能夠輕松地進行數(shù)據(jù)的轉換、拆分、合并及變換,已經(jīng)成為Python中執(zhí)行高級數(shù)據(jù)處理的事實標準庫,尤其適用于統(tǒng)計應用分析[5-7]。PyQt5是開發(fā)GUI應用程序的開源、跨平臺工具,為Python程序員提供了Qt5框架的全面訪問,具有強大的功能和易用性,尤其利用Qt設計師(Qt De?signer) 通過可視化組態(tài)可以快速、高效地設計與實現(xiàn)可視化應用程序及界面[8-10]。OS庫,即操作系統(tǒng)接口庫,用于文件及目錄操作。
2 系統(tǒng)設計與實現(xiàn)
2.1 前端GUI 界面設計
利用PyQt5圖形化設計軟件Qt設計師,通過拖、拉、拽等可視化開發(fā)方式設計靜態(tài)前端GUI界面。該界面主要包括以下元素:
1) 文件1參數(shù)配置、操作按鈕;
2) 文件2參數(shù)配置、操作按鈕;
3) 文件1、2 特征數(shù)據(jù)(總行數(shù)(Total) 、空行數(shù)(Null) 、有效數(shù)(Valid) 、匹配行數(shù)(Matched) 、不匹配行數(shù)(Unmatched)) 顯示;
4) 數(shù)據(jù)對比(Contrast) 、復制(Copy) 按鈕;
5) 文件1、2上次操作文件目錄;
6) 文件1、2內容顯示表格;
7) 匹配大小寫(Match case) 、總在最前(Always ontop) 功能復選框。
GUI界面預覽圖如圖2所示。
2.2 主程序設計
主程序運行流程如下:
1) 系統(tǒng)啟動后,加載GUI界面;
2) 進行系統(tǒng)初始化,包括:
①GUI初始化參數(shù)(Logo、尺寸規(guī)則等);
②綁定GUI 元素(按鈕、單行編輯框等)信號槽函數(shù);
③表格控件參數(shù)初始化(列數(shù)、列寬、選中規(guī)則);
④增加表格右鍵菜單‘復制Copy’功能;
⑤預置下拉菜單(列名、表頭(Header) 、編碼(En?coding)) 的可選內容;
⑥初始化系統(tǒng)標志位等。
3) 若系統(tǒng)存在歷史記錄,則從本地磁盤讀取配置文件并顯示到GUI 界面,否則顯示默認GUI 界面。例,獲取文件1上次操作路徑及設置參數(shù)的關鍵代碼如下:
# 獲取文件1上次操作路徑及設置參數(shù)
with open ('file_path_1.txt','r',encoding='utf-8') as file:
# 讀取內容并驗證合法性
content_list = file.readlines()
if len(content_list) == 7 and '' not in content_list:
# 去除換行符
path = content_list[0].rstrip('\n')
dir_path = os.path.dirname(path)
file_type = os.path.splitext(path)[-1]
# 驗證路徑和文件類型
if os.path.exists(path) and file_type in ['.xls','.xlsx','.csv']:
self.file_opened_1 = 1
self.last_dir_path_1 = dir_path
self.last_file_path_1 = path
# 顯示上次操作的文件路徑到GUI self.le_print_signal. le_print. emit(self. ui. le_path_1, self. last_file_path_1)
# 設置其他參數(shù)
self. ui. sbox_sheet_num_1. setValue(int(content_list[1].rstrip('\n')))
self.ui.cbox_col_source.setCurrentText(content_list[2].rstrip('\n'))
self. ui. cbox_header_1. setCurrentText(content_list[3].rstrip('\n'))
self.ui.cbox_encoding_1.setCurrentText(content_list[4].rstrip('\n'))
# 設置復選框狀態(tài)
self. ui. cb_on_top. setChecked(content_list[5]. rstrip('\n')=='True')
self. ui. cb_case. setChecked(content_list[6]. rstrip('\n')=='True')
4) 系統(tǒng)開始運行,持續(xù)監(jiān)控GUI信號(如打開(Open) 、重載(Reload) 、對比(Contrast) 按鈕的“點擊”動作、單行編輯框文本輸出動作等)并執(zhí)行對應槽函數(shù)(如打開、重載文件、執(zhí)行數(shù)據(jù)查找、數(shù)據(jù)復制、信息輸出等功能)。
主程序運行流程圖如圖3所示:
2.3 數(shù)據(jù)讀取及可視化
1) GUI參數(shù)設置。
在文件操作界面中設置文件1、2的以下參數(shù):
①Sheet num:工作表編號,從0開始;
②Source col:源列的編號,從A開始;
③Compare col:對比列的編號,從A開始;
④Target col:目標列的編號,從A開始;
⑤Header:數(shù)據(jù)表頭,可選None(無表頭)或1(表頭在第一行);
⑥Encoding:編碼,可選gbk或utf-8。
2) 數(shù)據(jù)讀取。
數(shù)據(jù)讀取有以下三種方式:
①直接打開方式:點擊‘打開(Open) ’按鈕,可瀏覽、打開計算機上的表格數(shù)據(jù)文件(支持.xls、.xlsx、.csv文件格式);
②記憶打開方式:如果存在歷史操作記錄,可點擊‘重載(Reload) ’按鈕,打開上次操作的文件;
③文件拖拽方式:將文件拖拽到文件操作區(qū)域內。
讀取excel文件的代碼為:
df=pd. read_excel(current_file_path, dtype= 'str',sheet_name=sheet_name, usecols=usecol, header=None).squeeze(axis=1)
讀取csv文件的代碼為:
df=pd.read_csv(current_file_path,dtype='str',usec?ols=usecol, header=None, encoding=encode). squeeze(axis=1)
其中,df為存儲數(shù)據(jù)的變量;pd為Pandas庫的引用縮寫;current_file_path為參數(shù)io內容,即文件位置及文件名;dtype為數(shù)據(jù)類型;sheet_name為數(shù)據(jù)所在sheet的編號,從0開始;usecols為數(shù)據(jù)所在列的列名;header為表頭數(shù)據(jù)所在的行號;encoding為數(shù)據(jù)編碼格式。
例,兩個數(shù)據(jù)文件file1.xlsx和file2.xlsx需要進行數(shù)據(jù)對比和對象提取。文件1包含兩列:A列“序號1”和B列“名稱1”;文件2包含三列:A列“序號2”、B列“名稱2”和C列“注釋2”。文件1、2表格內容如圖4、圖5所示:
系統(tǒng)讀取文件1、文件2數(shù)據(jù)并顯示到前端GUI 的界面效果如圖6所示:
2.4 數(shù)據(jù)匹配查找
文件1、2讀取后,點擊‘對比(Contrast) ’按鈕,開始檢查文件1中源列(Source col) 的內容是否存在于文件2的對比列(Compare col) 中(空行不參與對比)。如果存在,修改背景色為綠色,并返回文件2中對應的行號及該行目標列(Target col) 的內容;否則,修改背景色為黃色。如,文件1中B列(源列)第2行單元格內容為“a”,處在文件2中B列(對比列)的第2行,則源列背景色顯示為綠色,“匹配行”顯示為2,“匹配內容”為文件2中該行C列(目標列)單元格的內容“我是小a”;文件1中B列(源列)第18行單元格內容為“海狗”,在文件2中B列(對比例)中不存在,則文件1該單元格背景色為黃色。
對比查找結束后統(tǒng)計非空行的匹配數(shù)量(Matched) 和不匹配數(shù)量(Unmatched) 。數(shù)據(jù)對比查找結果如圖7所示:
2.5 其他功能
1) 區(qū)分大小寫功能:勾選‘Match case’復選框,則對比過程中區(qū)分英文字母的大小寫;否則,不區(qū)分大小寫。
2) 總在最前功能:勾選‘Always on top’復選框,則該軟件總運行在桌面其他窗口之上;否則,該軟件將會被后運行的桌面窗口覆蓋。
3) 數(shù)據(jù)復制功能:選中表格內容后,鼠標右鍵選擇‘復制Copy’或左鍵點擊‘復制(Copy) ’按鈕即可將選中的內容復制到剪貼板,并進一步粘貼到表格文件中。數(shù)據(jù)復制功能的關鍵代碼如下:
# 數(shù)據(jù)復制功能
def tbtn_copy_click_job(self):
# 獲取選中的行和列
data = self.ui.tw_1.selectedItems()
data_row_num = len({item.row() for item in data})
if data_row_num == 0:
win32api.MessageBox(0, '未選擇數(shù)據(jù)!', 'Warn?ing', 262192)
return
data_col_num = int(len(data)/data_row_num)
data = self.ui.tw_1.selectedIndexes()
item_list = [i.data() for i in data]
merge = []
for i in range(data_row_num):
merge. append(item_list[data_col_num*i: data_col_num*(i+1)])
for i in merge:
data = "\t".join(i)
merge[merge.index(i)] = data
result = '\n'.join(merge)
clipboard = QApplication.clipboard()
clipboard.setText(result)
win32api.MessageBox(0, '復制成功!', 'Informa?tion', 262208)
4) 操作日志記錄:保存并顯示上次操作文件的目錄,通過‘重載(Reload) ’按鈕可快速打開。
3 結論
本系統(tǒng)具有出色的通用性和靈活性,通過智能化和可視化的方式,使數(shù)據(jù)對比更加高效透明。它可廣泛應用于表格數(shù)據(jù)對比查找的各種場景,大幅提高跨文件數(shù)據(jù)查找、對比和提取的效率,減輕從業(yè)人員的工作負擔,為企業(yè)的數(shù)據(jù)處理工作帶來顯著的效益。
參考文獻:
[1] 司馬碧榮,鄧大政,楊媛.Python在電子表格中數(shù)據(jù)比對的應用[J].信息與電腦(理論版),2022,34(15):107-111.
[2] 梁林霞.Excel函數(shù)在中學班級管理中的應用[J].電腦編程技巧與維護,2022(11):104-106.
[3] 明日科技.Python+Kivy(App開發(fā))從入門到實踐[M].長春:吉林大學出版社,2020:2-10.
[4] 段小手.深入淺出Python機器學習[M].北京:清華大學出版社,2018:19-20.
[5] MCKINNEY W.Python數(shù)據(jù)分析[M].徐敬一,譯.2版.北京:機械工業(yè)出版社,2018:123-1341.
[6] JOHANSSON R.Python 科學計算和數(shù)據(jù)科學應用:基于NumPy、SciPy和Matplotlib[M].黃強,譯.北京:清華大學出版社,2020:295-3222.
[7] 李慶輝.深入淺出Pandas:利用Python進行數(shù)據(jù)處理與分析[M].北京:機械工業(yè)出版社,2021:9-16.
[8] 張武.基于Pyinstaller+PyQt5的Python打包可視化研究與應用[J].湖南郵電職業(yè)技術學院學報,2023,22(4):44-47.
[9] 王維波,栗寶鵑,張曉東.Python Qt GUI與數(shù)據(jù)可視化編程[M].北京:人民郵電出版社,2019:5-10.
[10] 唐佑輝,許成義,趙云昌.基于PyQt5的水深比對檢測系統(tǒng)在水下地形測量檢查中的應用[J].山東國土資源,2023,39(8):58-62.
【通聯(lián)編輯:光文玲】