基于PyQt5制作Excel文件数据去重小工具
作者:Python 发布时间:2023-10-14 05:44:58
标签:Python,PyQt5,数据去重
需求说明:将单个或者多个Excel文件数据进行去重操作,去重的列可以通过自定义制定。
开始源码说明之前,先说明一下工具的使用过程。
1、准备需要去重的数据文件。
2、使用工具执行去重操作。
3、处理完成后的结果文件。
PyQt5 界面UI相关的模块引用
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
核心组件
from PyQt5.QtCore import *
主题样式模块引用
from QCandyUi import CandyWindow
在这个应用中使用一个默认的杨氏模块QCandyUi,可以改变整个应用的主题颜色设计不用一个控件一个控件的去修改样式。有一个不好的地方就是应用本身设置的标题和应用图标不能生效,必须利用这个样式控件CandyWindow来修改,就像下面这样需要将我们自己写的UI空间放到里面。
# w = CandyWindow.createWindow(EDataDel(), theme='blueGreen', title='Excel批数据去重器 公众号:[Python 集中营]',
# ico_path='数据去重.ico')
# w.show()
应用操作相关模块
import sys
import os
Excel数据处理模块
import pandas as pd
import openpyxl as pxl
UI界面布局设计、信号量槽函数绑定实现
class EDataDel(QWidget):
def __init__(self):
super(EDataDel, self).__init__()
self.init_ui()
def init_ui(self):
self.brower = QTextBrowser()
self.brower.setReadOnly(True)
self.brower.setFont(QFont('微软雅黑', 8))
self.brower.setPlaceholderText('处理进程展示区域...')
self.brower.ensureCursorVisible()
form = QFormLayout()
self.file_paths = QLineEdit()
self.file_paths.setReadOnly(True)
self.file_paths_btn = QPushButton()
self.file_paths_btn.setText('加载批文件')
self.file_paths_btn.clicked.connect(self.file_paths_btn_click)
self.colums_label = QLabel()
self.colums_label.setText('自定义去重复列')
self.colums_text = QLineEdit()
self.colums_text.setPlaceholderText('列名1,列名2,列名3,...')
form.addRow(self.file_paths, self.file_paths_btn)
form.addRow(self.colums_label, self.colums_text)
self.work = DataWork(self)
self.work.trigger.connect(self.update_log)
self.work.finished.connect(self.finished)
vbox = QVBoxLayout()
self.start_btn = QPushButton()
self.start_btn.setText('开始执行')
self.start_btn.clicked.connect(self.start_btn_click)
vbox.addLayout(form)
vbox.addWidget(self.start_btn)
hbox = QHBoxLayout()
hbox.addWidget(self.brower)
hbox.addLayout(vbox)
self.setLayout(hbox)
def file_paths_btn_click(self):
paths = QFileDialog.getOpenFileNames(self, '选择文件', os.getcwd(), 'Excel Files(*.xlsx)')
files = paths[0]
path_strs = ''
for file in files:
path_strs = path_strs + file + ';'
self.file_paths.setText(path_strs)
if self.file_paths.text().strip() != '':
self.update_log('已经完成批文件路径加载!')
else:
self.update_log('没有选择任何文件!')
def save_dir_btn_click(self):
directory = QFileDialog.getExistingDirectory(self, '选择文件夹', os.getcwd())
self.save_dir.setText(directory)
def update_log(self, text):
cursor = self.brower.textCursor()
cursor.movePosition(QTextCursor.End)
self.brower.append(text)
self.brower.setTextCursor(cursor)
self.brower.ensureCursorVisible()
def start_btn_click(self):
self.start_btn.setEnabled(False)
self.work.start()
def finished(self, finished):
if finished is True:
self.start_btn.setEnabled(True)
创建子线程,处理业务逻辑(清理Excel重复文件)
class DataWork(QThread):
trigger = pyqtSignal(str)
finished = pyqtSignal(bool)
def __init__(self, parent=None):
super(DataWork, self).__init__(parent)
self.parent = parent
self.working = True
def __del__(self):
self.working = False
self.wait()
def run(self):
self.trigger.emit('启动批量处理子线程...')
file_paths = self.parent.file_paths.text().strip()
colums_text = self.parent.colums_text.text().strip()
colums = []
if ',' in colums_text:
colums = colums_text.split(',')
else:
colums.append(colums_text)
self.trigger.emit('获取配置项完成!')
for file in file_paths.split(';'):
if file.strip() != '':
web_sheet = pxl.load_workbook(file)
sheets = web_sheet.sheetnames
print(file)
new_file = file.split('.')[0] + '_已去重.' + file.split('.')[1]
print(new_file)
writer = pd.ExcelWriter(new_file)
for sheet in sheets:
sheet_name = sheet.title()
print(sheet_name)
self.trigger.emit('准备处理工作表名称:' + str(sheet.title()))
data_frame = pd.read_excel(file, sheet_name=sheet_name)
print(data_frame)
repe = data_frame.duplicated(subset=colums)
repe = repe[repe]
print(data_frame.iloc[repe.index])
res = data_frame.drop_duplicates(subset=colums)
print(res)
self.trigger.emit(str(sheet.title()) + ':已清除')
res.to_excel(writer, sheet_name, index=False)
writer.save()
else:
self.trigger.emit('当前文件路径为空,继续...')
self.trigger.emit('数据处理完成...')
self.finished.emit(True)
使用主函数启动整个应用
if __name__ == '__main__':
app = QApplication(sys.argv)
w = CandyWindow.createWindow(EDataDel(), theme='blueGreen', title='Excel批数据去重器 公众号:[Python 集中营]',
ico_path='数据去重.ico')
w.show()
sys.exit(app.exec_())
来源:https://www.cnblogs.com/lwsbc/p/16088873.html


猜你喜欢
- 实现一个不规则窗体这里我们实现一个圆形窗体,实现其他形状的窗体与这个方法类似。首先,把窗口的高度(height)和宽度(width)值修改为
- 本文实例讲述了微信小程序MUI导航栏透明渐变功能。分享给大家供大家参考,具体如下:导航栏透明渐变效果实现原理1. 利用position:ab
- 在 IT 开发中,有时我们需要对结构体数组进行排序。Go 语言提供了 sort 包,其中最常用的一种是 sort.Slice() 函数。但是
- 你知道(X)HTML中最多余的标签中是什么吗?在我看来就是这个<a>标签,不错,就是每个网站使用最多的超级链接标签<a&g
- 需 求 分 析 1、读取指定目录下的所有文件2、读取指定文件,输出文件内容3、创建一个文件并保存到指定目录实 现 过 程Python写代码简
- 如下所示:import datetime #获取两个日期间的所有日期 def getEveryDay(begin_date,end_date
- 最近几天仔细研究了一下vertical-align这个属性,结果让我大吃一惊,这个很“资深”的CSS标准竟然在各个浏览器里面的表现都各不相同
- 今天为大家介绍几个Python“装逼”实例代码,python绘制樱花、玫瑰、圣诞树代码实例,主要使用了turtle库Python绘制樱花代码
- 贪吃蛇游戏是经典手机游戏,既简单又耐玩。通过控制蛇头方向吃蛋,使得蛇变长,从而获得积分。在诺基亚时代,风靡整个手机界,今天我们来看看另类的,
- 最近自己准备学习Python,之前也看了点基础知识。做图形这块需要用到OpenCV所以就需要配置环境,之前准备用的是Python3,后来发现
- 1、场景import { observe } from "./reactive";import Watcher from
- 这两副图片哪张更能勾起你买东西的欲望呢?相信大多数买家更喜欢看大图,实物图,产品细节图等.如果我们的卖家更能倾听下我们买家的心声.他们的产品
- 点工具栏中〔显示估计的查询计划〕,结果提示Documents and Settings\XXX\Local Settings\Temp\1\
- 可实现功能:1.随机生成一个整数。2.随机生成任意范围内的一个整数。3.随机生成指定长度的整数组4.随机生成指定长度的任意范围的整数组5.随
- 最近在阅读Python微型Web框架Bottle的源码,发现了Bottle中有一个既是装饰器类又是描述符的有趣实现。刚好这两个点是Pytho
- 这篇文章主要介绍了python错误调试及单元文档测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 我的环境,Windows10,Python3.6.3查询了很多有关资料,发现都是Python2版本操作Word文件的,所以就写了这篇短小的文
- 一 创建mappingPUT test{ "mappings": { "
- 1下载安装1.1打开官网http://www.jetbrains.com/pycharm/download/#section=windows
- 在如今的Web设计中,图片的应用是必不可少的,为了更好地设计网站效果,大体积的图片被越来越多地应用到Web设计中来,所以,更好地优化图片文件