基于Python 的表格数据查找系统设计与实现
作者: 江海涛
摘要:随着信息化的发展,数据存储变得更加灵活多样,数据处理的需求也日益增长。在两个数据表格间进行数据匹配查找时,常规方法是采用VLOOKUP()等关联匹配类函数。然而,当表格数量较多、操作频繁时,这种方式效率较低。为解决这一问题,文章基于Python语言,利用pandas、PyQt5等生态库,设计了一套表格数据自动化查找系统。该系统大大提高了数据查找、对比、提取的效率和准确性,降低了从业人员的工作强度。
关键词:Python;PyQt5;pandas;表格数据对比;数据查找
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2024)31-0051-03
开放科学(资源服务)标识码(OSID) :
0 引言
在表格数据查找应用中,传统方式是使用VLOOKUP()等关联匹配函数[1-2]。低频操作时,这是一种高效的处理方式。但当文件数量多且操作频繁时,大量调用匹配函数和设置参数会降低效率。为解决上述问题,本文基于Python及其生态库,开发了一款灵活、友好的表格数据查找系统。该系统能够快速实现跨表数据查找和目标数据提取。
1 技术方案简介
本系统采用Python编程环境实现基本逻辑处理,通过pandas库读取表格数据,再利用PyQt5开发GUI (图形用户界面)进行数据展示及人机交互。技术架构如图1所示:
Python是一种跨平台、开源、免费的解释型高级编程语言,功能强大。它能够轻松地将其他语言制作的模块联结在一起,在Web编程、图形处理、大数据处理、科学计算等领域都有广泛应用[3-4]。作为数据分析的主要工具之一,pandas是Python环境中用于数据处理和分析的框架库。该库为序列数据和表数据的存储提供了快速、灵活、明确的数据结构,能够轻松地进行数据的转换、拆分、合并及变换,已经成为Python中执行高级数据处理的事实标准库,尤其适用于统计应用分析[5-7]。PyQt5是开发GUI应用程序的开源、跨平台工具,为Python程序员提供了Qt5框架的全面访问,具有强大的功能和易用性,尤其利用Qt设计师(Qt De⁃signer) 通过可视化组态可以快速、高效地设计与实现可视化应用程序及界面[8-10]。OS库,即操作系统接口库,用于文件及目录操作。
2 系统设计与实现
2.1 前端GUI 界面设计
利用PyQt5图形化设计软件Qt设计师,通过拖、拉、拽等可视化开发方式设计静态前端GUI界面。该界面主要包括以下元素:
1) 文件1参数配置、操作按钮;
2) 文件2参数配置、操作按钮;
3) 文件1、2 特征数据(总行数(Total) 、空行数(Null) 、有效数(Valid) 、匹配行数(Matched) 、不匹配行数(Unmatched)) 显示;
4) 数据对比(Contrast) 、复制(Copy) 按钮;
5) 文件1、2上次操作文件目录;
6) 文件1、2内容显示表格;
7) 匹配大小写(Match case) 、总在最前(Always ontop) 功能复选框。
GUI界面预览图如图2所示。
2.2 主程序设计
主程序运行流程如下:
1) 系统启动后,加载GUI界面;
2) 进行系统初始化,包括:
①GUI初始化参数(Logo、尺寸规则等);
②绑定GUI 元素(按钮、单行编辑框等)信号槽函数;
③表格控件参数初始化(列数、列宽、选中规则);
④增加表格右键菜单‘复制Copy’功能;
⑤预置下拉菜单(列名、表头(Header) 、编码(En⁃coding)) 的可选内容;
⑥初始化系统标志位等。
3) 若系统存在历史记录,则从本地磁盘读取配置文件并显示到GUI 界面,否则显示默认GUI 界面。例,获取文件1上次操作路径及设置参数的关键代码如下:
# 获取文件1上次操作路径及设置参数
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)
# 设置其他参数
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'))
# 设置复选框状态
self. ui. cb_on_top. setChecked(content_list[5]. rstrip('\n')=='True')
self. ui. cb_case. setChecked(content_list[6]. rstrip('\n')=='True')
4) 系统开始运行,持续监控GUI信号(如打开(Open) 、重载(Reload) 、对比(Contrast) 按钮的“点击”动作、单行编辑框文本输出动作等)并执行对应槽函数(如打开、重载文件、执行数据查找、数据复制、信息输出等功能)。
主程序运行流程图如图3所示:
2.3 数据读取及可视化
1) GUI参数设置。
在文件操作界面中设置文件1、2的以下参数:
①Sheet num:工作表编号,从0开始;
②Source col:源列的编号,从A开始;
③Compare col:对比列的编号,从A开始;
④Target col:目标列的编号,从A开始;
⑤Header:数据表头,可选None(无表头)或1(表头在第一行);
⑥Encoding:编码,可选gbk或utf-8。
2) 数据读取。
数据读取有以下三种方式:
①直接打开方式:点击‘打开(Open) ’按钮,可浏览、打开计算机上的表格数据文件(支持.xls、.xlsx、.csv文件格式);
②记忆打开方式:如果存在历史操作记录,可点击‘重载(Reload) ’按钮,打开上次操作的文件;
③文件拖拽方式:将文件拖拽到文件操作区域内。
读取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为存储数据的变量;pd为Pandas库的引用缩写;current_file_path为参数io内容,即文件位置及文件名;dtype为数据类型;sheet_name为数据所在sheet的编号,从0开始;usecols为数据所在列的列名;header为表头数据所在的行号;encoding为数据编码格式。
例,两个数据文件file1.xlsx和file2.xlsx需要进行数据对比和对象提取。文件1包含两列:A列“序号1”和B列“名称1”;文件2包含三列:A列“序号2”、B列“名称2”和C列“注释2”。文件1、2表格内容如图4、图5所示:
系统读取文件1、文件2数据并显示到前端GUI 的界面效果如图6所示:
2.4 数据匹配查找
文件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该单元格背景色为黄色。
对比查找结束后统计非空行的匹配数量(Matched) 和不匹配数量(Unmatched) 。数据对比查找结果如图7所示:
2.5 其他功能
1) 区分大小写功能:勾选‘Match case’复选框,则对比过程中区分英文字母的大小写;否则,不区分大小写。
2) 总在最前功能:勾选‘Always on top’复选框,则该软件总运行在桌面其他窗口之上;否则,该软件将会被后运行的桌面窗口覆盖。
3) 数据复制功能:选中表格内容后,鼠标右键选择‘复制Copy’或左键点击‘复制(Copy) ’按钮即可将选中的内容复制到剪贴板,并进一步粘贴到表格文件中。数据复制功能的关键代码如下:
# 数据复制功能
def tbtn_copy_click_job(self):
# 获取选中的行和列
data = self.ui.tw_1.selectedItems()