Python+PyQt實現(xiàn)一鍵生成文件目錄
一、引言
因辦公要求,經(jīng)常需要統(tǒng)計“底層人員”上交的各種文件,人數(shù)少還好說,人多就是一個稍微復(fù)雜的問題了。當(dāng)然這個問題也可以通過“暴 力”的方式解決,但是工作效率會大大折扣。所以,為極大提高辦公效率,就謀生了這個想法。
二、GUI界面設(shè)計
使用PyQt5進行界面的搭建,最終界面如下:
1.第一步:確定被讀取文件所在的文件夾。
2.第二步:確定最終讀取結(jié)果是否需要保留其文件類型(即后綴)??筛鶕?jù)個人需求而定,以我的工作經(jīng)驗來說,第二種“不保留”是最常見的,即只獲取文件名稱。
3.第三步:選擇最終讀取結(jié)果存放的文件類型,下拉列表中包含了最常用的五種文件類型:txt文本文件、.doc文檔、.docx文檔、.xls工作表和.xlsx工作表(如下圖所示)。若跳過此步驟,默認(rèn)保存文件類型為txt文本文件。
4.最后單擊“開始讀取”按鈕,即可成功獲取當(dāng)前目錄下所有文件的名稱并存儲在步驟三所選的文件類型中。若還想繼續(xù)讀取其他文件名稱,從步驟一開始重復(fù)即可;否則,單擊“退出系統(tǒng)”即可退出程序即可。
最后附上通過pyuic5產(chǎn)生的GUI界面代碼jiemian.py:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'jiemian.ui' # # Created by: PyQt5 UI code generator 5.15.11 # # 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 class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.setEnabled(True) Form.resize(460, 500) Form.setMinimumSize(QtCore.QSize(460, 500)) Form.setMaximumSize(QtCore.QSize(460, 500)) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/image1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) Form.setWindowIcon(icon) self.groupBox = QtWidgets.QGroupBox(Form) self.groupBox.setGeometry(QtCore.QRect(40, 180, 381, 61)) self.groupBox.setAutoFillBackground(False) self.groupBox.setTitle("") self.groupBox.setFlat(False) self.groupBox.setObjectName("groupBox") self.radioButton = QtWidgets.QRadioButton(self.groupBox) self.radioButton.setGeometry(QtCore.QRect(90, 40, 81, 16)) self.radioButton.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) self.radioButton.setObjectName("radioButton") self.label_2 = QtWidgets.QLabel(self.groupBox) self.label_2.setGeometry(QtCore.QRect(20, 10, 281, 21)) font = QtGui.QFont() font.setFamily("Adobe Arabic") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.label_2.setFont(font) self.label_2.setObjectName("label_2") self.radioButton_2 = QtWidgets.QRadioButton(self.groupBox) self.radioButton_2.setGeometry(QtCore.QRect(200, 40, 81, 16)) self.radioButton_2.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) self.radioButton_2.setObjectName("radioButton_2") self.label = QtWidgets.QLabel(self.groupBox) self.label.setGeometry(QtCore.QRect(290, 0, 201, 41)) font = QtGui.QFont() font.setFamily("Adobe Arabic") font.setPointSize(20) font.setBold(False) font.setWeight(50) self.label.setFont(font) self.label.setObjectName("label") self.groupBox_2 = QtWidgets.QGroupBox(Form) self.groupBox_2.setGeometry(QtCore.QRect(40, 270, 381, 71)) self.groupBox_2.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) self.groupBox_2.setTitle("") self.groupBox_2.setObjectName("groupBox_2") self.label_4 = QtWidgets.QLabel(self.groupBox_2) self.label_4.setGeometry(QtCore.QRect(20, 10, 311, 21)) font = QtGui.QFont() font.setFamily("Adobe Arabic") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.label_4.setFont(font) self.label_4.setObjectName("label_4") self.comboBox = QtWidgets.QComboBox(self.groupBox_2) self.comboBox.setGeometry(QtCore.QRect(60, 40, 261, 22)) self.comboBox.setObjectName("comboBox") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.label_5 = QtWidgets.QLabel(Form) self.label_5.setGeometry(QtCore.QRect(270, 20, 141, 31)) font = QtGui.QFont() font.setFamily("Adobe Arabic") font.setPointSize(16) self.label_5.setFont(font) self.label_5.setObjectName("label_5") self.groupBox_5 = QtWidgets.QGroupBox(Form) self.groupBox_5.setGeometry(QtCore.QRect(40, 370, 381, 71)) self.groupBox_5.setTitle("") self.groupBox_5.setObjectName("groupBox_5") self.label_9 = QtWidgets.QLabel(self.groupBox_5) self.label_9.setGeometry(QtCore.QRect(20, 10, 231, 21)) font = QtGui.QFont() font.setFamily("Adobe Arabic") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.label_9.setFont(font) self.label_9.setObjectName("label_9") self.pushButton_2 = QtWidgets.QPushButton(self.groupBox_5) self.pushButton_2.setGeometry(QtCore.QRect(200, 40, 121, 23)) self.pushButton_2.setObjectName("pushButton_2") self.pushButton = QtWidgets.QPushButton(self.groupBox_5) self.pushButton.setGeometry(QtCore.QRect(60, 40, 121, 23)) self.pushButton.setObjectName("pushButton") self.label_8 = QtWidgets.QLabel(Form) self.label_8.setGeometry(QtCore.QRect(50, 20, 251, 31)) font = QtGui.QFont() font.setFamily("Adobe Arabic") font.setPointSize(18) font.setBold(False) font.setWeight(50) self.label_8.setFont(font) self.label_8.setObjectName("label_8") self.label_10 = QtWidgets.QLabel(Form) self.label_10.setGeometry(QtCore.QRect(350, 10, 71, 51)) self.label_10.setText("") self.label_10.setPixmap(QtGui.QPixmap(":/image1.png")) self.label_10.setObjectName("label_10") self.label_6 = QtWidgets.QLabel(Form) self.label_6.setGeometry(QtCore.QRect(60, 90, 311, 21)) font = QtGui.QFont() font.setFamily("Adobe Arabic") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.label_6.setFont(font) self.label_6.setObjectName("label_6") self.pushButton_3 = QtWidgets.QPushButton(Form) self.pushButton_3.setGeometry(QtCore.QRect(100, 120, 261, 23)) self.pushButton_3.setObjectName("pushButton_3") self.groupBox_3 = QtWidgets.QGroupBox(Form) self.groupBox_3.setGeometry(QtCore.QRect(40, 80, 381, 80)) self.groupBox_3.setTitle("") self.groupBox_3.setObjectName("groupBox_3") self.groupBox_3.raise_() self.groupBox_5.raise_() self.groupBox_2.raise_() self.groupBox.raise_() self.label_5.raise_() self.label_8.raise_() self.label_10.raise_() self.label_6.raise_() self.pushButton_3.raise_() self.retranslateUi(Form) self.pushButton_2.clicked.connect(Form.close) # type: ignore QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Read_file")) self.radioButton.setText(_translate("Form", "保留")) self.label_2.setText(_translate("Form", "二、文件名稱是否需要保留其類型后綴")) self.radioButton_2.setText(_translate("Form", "不保留")) self.label.setText(_translate("Form", "(.XXX):")) self.label_4.setText(_translate("Form", "三、請選擇獲取結(jié)果最終存放的文件類型:")) self.comboBox.setItemText(0, _translate("Form", "文本文檔.txt")) self.comboBox.setItemText(1, _translate("Form", "DOC文檔.doc")) self.comboBox.setItemText(2, _translate("Form", "DCOX文檔.docx")) self.comboBox.setItemText(3, _translate("Form", "XLS工作表.xls")) self.comboBox.setItemText(4, _translate("Form", "XLSX工作表.xlsx")) self.label_5.setText(_translate("Form", "Designed By")) self.label_9.setText(_translate("Form", "四、請選擇以下操作命令:")) self.pushButton_2.setText(_translate("Form", "退出系統(tǒng)")) self.pushButton.setText(_translate("Form", "開始讀取")) self.label_8.setText(_translate("Form", "文件名稱獲取系統(tǒng)")) self.label_6.setText(_translate("Form", "一、請選擇待獲取文件所在的文件夾:")) self.pushButton_3.setText(_translate("Form", "點擊選擇待讀取文件所在的文件夾")) import ziyuan_rc //用于個人logo或圖標(biāo)顯示,可根據(jù)個人需求設(shè)置,也可注掉
三、程序詳解
1.導(dǎo)入所需模塊
import sys,os from jiemian import * from PyQt5.QtWidgets import QApplication, QWidget from docx import Document from openpyxl import Workbook
2.調(diào)整窗口大小
# 保持窗口大小和qtdesigner中的一致 from PyQt5 import QtCore QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
這一步要額外注意:當(dāng)在pyqt5中的設(shè)計界面與使用pyuic生成的界面大小不一致時,需要導(dǎo)入Qtcore模塊實現(xiàn)自適應(yīng)縮放。
設(shè)計界面
生成界面
加上上述代碼后,兩者才會變得一致。
3.彈出選擇文件路徑對話框
def lujing(self): filepath = QtWidgets.QFileDialog.getExistingDirectory(self, "選取存放待讀取文件的文件夾") # 獲取文件夾的路徑 if filepath: self.path = filepath self.lujing_flag = True
此def對應(yīng)著步驟一。最后設(shè)立一個標(biāo)志位lujing_flag,以此來判斷操作者是否完成了步驟一(后續(xù)會用到)。
對話框效果如下:
4.對后綴的處理
def xuanze(self): filelist = os.listdir(self.path) if self.radioButton.isChecked(): # 保留后綴 self.result_list = filelist else: if self.radioButton_2.isChecked(): # 去掉待命名文件的格式后綴 baoliu_list = [] # 存放最終讀取結(jié)果 for filename in filelist: for zifu in filename: if zifu == ".": dian_suoyin = filename.index(zifu) baoliu_list.append(filename[:dian_suoyin]) break self.result_list = baoliu_list
如果用戶選擇的是保留后綴,則將filelist的內(nèi)容賦給result_list;否則,通過循環(huán)定位后綴標(biāo)識符“.”在對應(yīng)文件名中的索引,利用此索引對此文件名依次切片,最終獲得純文件名(不保留后綴)。
5.寫入并生成存儲文件
def shengcheng(self): if self.lujing_flag == True: if (self.radioButton.isChecked()==False) and (self.radioButton_2.isChecked()==False): QtWidgets.QMessageBox.critical(self, '提示', '請完成步驟二!') else: selected_index = self.comboBox.currentIndex() wenjian_shengcheng(selected_index, self.result_list) QtWidgets.QMessageBox.information(self, '成功', '文件名稱讀取結(jié)果保存在當(dāng)前目錄下,請查看!') else: QtWidgets.QMessageBox.critical(self, '提示', '請完成步驟一!')
依次對步驟完成情況進行判斷,并通過自定義函數(shù)wenjian_shengcheng寫入并生成文件。
自定義函數(shù)wenjian_shengcheng如下:
def wenjian_shengcheng(suoyin, content): name = "read_result" # 產(chǎn)生不同種類的文件 match suoyin: case 0: # 生成文本文檔txt with open(name+'.txt','w') as f: for item in content: f.write(f"{item}\n") case 1: # 生成doc文檔 doc = Document() for item in content: paragraph = doc.add_paragraph(item) doc.save(name+'.doc') case 2: # 生成docx文檔 doc = Document() for item in content: paragraph = doc.add_paragraph(item) doc.save(name+'.docx') case 3: # 生成xls工作表 wb = Workbook() ws = wb.active for row in range(1, len(content) + 1): ws.cell(row=row, column=1, value=content[row - 1]) wb.save(name+'.xls') case 4: # 生成xlsx工作表 wb = Workbook() ws = wb.active for row in range(1, len(content) + 1): ws.cell(row=row, column=1, value=content[row - 1]) wb.save(name+'.xlsx')
四、總程序代碼Read_file.py
import sys,os from jiemian import * from PyQt5.QtWidgets import QApplication, QWidget from docx import Document from openpyxl import Workbook # 保持窗口大小和qtdesigner中的一致 from PyQt5 import QtCore QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) class login_interface(QWidget, Ui_Form): def __init__(self): super(QWidget, self).__init__() self.setupUi(self) # 綁定信號 self.radioButton.clicked.connect(self.xuanze) self.radioButton_2.clicked.connect(self.xuanze) self.pushButton.clicked.connect(self.shengcheng) self.pushButton_3.clicked.connect(self.lujing) self.result_list = [] # 在__init__構(gòu)造函數(shù)中定義,通過self關(guān)鍵字訪問,每個實例擁有獨立副本 self.path = "" self.lujing_flag = False def lujing(self): filepath = QtWidgets.QFileDialog.getExistingDirectory(self, "選取存放待讀取文件的文件夾") # 獲取文件夾的路徑 if filepath: self.path = filepath self.lujing_flag = True def xuanze(self): filelist = os.listdir(self.path) if self.radioButton.isChecked(): # 保留后綴 self.result_list = filelist else: if self.radioButton_2.isChecked(): # 去掉待命名文件的格式后綴 baoliu_list = [] # 存放最終讀取結(jié)果 for filename in filelist: for zifu in filename: if zifu == ".": dian_suoyin = filename.index(zifu) baoliu_list.append(filename[:dian_suoyin]) break self.result_list = baoliu_list def shengcheng(self): if self.lujing_flag == True: if (self.radioButton.isChecked()==False) and (self.radioButton_2.isChecked()==False): QtWidgets.QMessageBox.critical(self, '提示', '請完成步驟二!') else: selected_index = self.comboBox.currentIndex() wenjian_shengcheng(selected_index, self.result_list) QtWidgets.QMessageBox.information(self, '成功', '文件名稱讀取結(jié)果保存在當(dāng)前目錄下,請查看!') else: QtWidgets.QMessageBox.critical(self, '提示', '請完成步驟一!') def wenjian_shengcheng(suoyin, content): name = "read_result" # 產(chǎn)生不同種類的文件 match suoyin: case 0: # 生成文本文檔txt with open(name+'.txt','w') as f: for item in content: f.write(f"{item}\n") case 1: # 生成doc文檔 doc = Document() for item in content: paragraph = doc.add_paragraph(item) doc.save(name+'.doc') case 2: # 生成docx文檔 doc = Document() for item in content: paragraph = doc.add_paragraph(item) doc.save(name+'.docx') case 3: # 生成xls工作表 wb = Workbook() ws = wb.active for row in range(1, len(content) + 1): ws.cell(row=row, column=1, value=content[row - 1]) wb.save(name+'.xls') case 4: # 生成xlsx工作表 wb = Workbook() ws = wb.active for row in range(1, len(content) + 1): ws.cell(row=row, column=1, value=content[row - 1]) wb.save(name+'.xlsx') if __name__ == '__main__': app = QApplication(sys.argv) w = login_interface() w.show() sys.exit(app.exec_())
到此這篇關(guān)于Python+PyQt實現(xiàn)一鍵生成文件目錄的文章就介紹到這了,更多相關(guān)Python生成文件目錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Docker構(gòu)建Python Flask程序的詳細(xì)教程
在當(dāng)今的軟件開發(fā)領(lǐng)域,容器化技術(shù)正變得越來越流行,而 Docker 無疑是其中的佼佼者,本文我們就來聊聊如何使用 Docker 構(gòu)建一個簡單的 Python Flask 程序吧2025-07-07python反編譯學(xué)習(xí)之字節(jié)碼詳解
這篇文章主要給大家介紹了關(guān)于python反編譯學(xué)習(xí)之字節(jié)碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python趣味爬蟲之用Python實現(xiàn)智慧校園一鍵評教
你還在為智慧校園每周的評教而苦惱嗎?今天我來幫你解放雙手,用Python實現(xiàn)一鍵評教,從此生活無憂無慮,文中有非常詳細(xì)的代碼示例,需要的朋友可以參考下2021-05-05Pytorch GPU顯存充足卻顯示out of memory的解決方式
今天小編就為大家分享一篇Pytorch GPU顯存充足卻顯示out of memory的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01django應(yīng)用JWT(JSON?Web?Token)實戰(zhàn)教程
在前后端分離的項目中,JWT(JSON?Web?Token)作為一種廣泛使用的身份驗證和授權(quán)機制,提供了一種安全、高效的方式來保護RESTful?API,本文詳細(xì)介紹了JWT的概念、優(yōu)勢、在Django中的應(yīng)用步驟和使用方法,是構(gòu)建安全、高效Web應(yīng)用的有效指南2024-10-10