项目树:
整体架构:
python + pyqt5 + qtdesigner
IDE:pycharm
开发步骤:
-
先通过qtdesigner设计界面后,到pycharm中解析为.py文件。项目中名称为div.py
- 在新建文件分割.py ,主要写的是分割功能、界面槽和信号的绑定等功能代码
- div.ico是项目用到的图标资源
- div.ui是qtdesigner的文件,通过它可解析出.py文件。
- resource.qrc为图标资源映射文件,在项目所在文件夹中新建txt后输入如下代码:
<RCC>
<qresource prefix="/">
<file>div.ico</file>
</qresource>
</RCC>
保存,并修改后缀名为.qrc,通过pycharm插件工具PyRCC,生成resource.py,在主功能py文件中导入即可。此步骤主要是为了使项目打包为exe时,图标资源也同步被打包成功。
附上div.py:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'div.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setFixedSize(788, 543)
MainWindow.setWindowIcon(QIcon(':/div.ico'))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(10, 10, 581, 51))
self.lineEdit.setObjectName("lineEdit")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(600, 10, 181, 51))
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(12)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(10, 70, 581, 411))
self.textEdit.setObjectName("textEdit")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(600, 310, 181, 171))
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.pushButton_2.setFont(font)
self.pushButton_2.setObjectName("pushButton_2")
icon2 = QIcon(':/div.ico')
self.pushButton_2.setIcon(icon2)
self.pushButton_2.setIconSize(QtCore.QSize(42, 42))
self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
self.progressBar.setGeometry(QtCore.QRect(10, 482, 771, 31))
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName("progressBar")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(600, 100, 181, 31))
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(10)
self.label.setFont(font)
self.label.setAutoFillBackground(False)
self.label.setFrameShadow(QtWidgets.QFrame.Plain)
self.label.setObjectName("label")
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(600, 140, 181, 41))
self.lineEdit_2.setObjectName("lineEdit_2")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "文件分割助手V1.0 by LX"))
self.pushButton.setText(_translate("MainWindow", "选择文件路径"))
self.pushButton_2.setText(_translate("MainWindow", "分割"))
self.label.setText(_translate("MainWindow", "请输入每个文件的行数"))
附上文件分割.py:
import div
import PyQt5.QtWidgets as qw
import winreg
import sys
import pandas as pd
import math
import resource
#忽略告警
import warnings
warnings.filterwarnings("ignore")
class myForm(qw.QMainWindow, div.Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.load_file)
self.pushButton_2.clicked.connect(self.div_file)
# 获取桌面路径
def get_desktop(self):
self.key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')
desktop_url = r'' + winreg.QueryValueEx(self.key, 'Desktop')[0]
return desktop_url
# 打开文件
def load_file(self): # 加载CSV文件
fileOpen = qw.QFileDialog.getOpenFileName(None, "打开文件", self.get_desktop(), "All Files (*)")
self.lineEdit.setText(fileOpen[0])
# print(self.lineEdit.text())
if (len(self.lineEdit.text()) != 0):
self.textEdit.append('已选择文件!') # 追加写入文本
else:
self.textEdit.append('未选择文件!') # 追加写入文本
def div_file(self): # 分割文件
# 设置进度条
self.progressBar.setValue(0)
data = pd.read_csv(self.lineEdit.text(), encoding='gbk', error_bad_lines=False, sep=None) # 不加后面参数,会报错
self.textEdit.append('已载入文件!') # 追加写入文本
one_file_count = int(self.lineEdit_2.text())
if one_file_count > data.shape[0]:
return qw.QMessageBox.question(self, '糟糕', "你输入的数字太大,超过了文件的总行数!", qw.QMessageBox.Yes)
if one_file_count > 1010000:
return qw.QMessageBox.question(self, '糟糕', "你输入的数字太大,超过了单个CSV文件的容量!", qw.QMessageBox.Yes)
pac = math.ceil(data.shape[0] / one_file_count) # 向上取整
start = 0
end = one_file_count
for i in range(pac):
if i == (pac - 1):
end = data.shape[0]
data2 = data.iloc[start:end]
data2.to_csv(self.get_desktop() +'\分割后文件_{}'.format(i+1) + '.csv', index=0)
start += one_file_count
end += one_file_count
pgb_value = (i+1)/pac * 100
self.progressBar.setValue(pgb_value) # 设置进度条
# print("已分割到第{0}个文件!".format(i + 1))
# print('全部分割完成,请到桌面查收!')
self.textEdit.append('文件分割完成,请到桌面查收!') # 追加写入文本
qw.QMessageBox.question(self, '恭喜', "文件分割完成,请到桌面查收!", qw.QMessageBox.Yes)
if __name__ == '__main__':
app = qw.QApplication(sys.argv)
w = myForm()
w.show()
sys.exit(app.exec_())