Python+PyQt实现一键生成文件目录

 更新时间:2025年07月28日 09:25:35   作者:Goona_  
这篇文章主要为大家详细介绍了Python如何结合PyQt实现一键生成文件目录,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、引言

因办公要求,经常需要统计“底层人员”上交的各种文件,人数少还好说,人多就是一个稍微复杂的问题了。当然这个问题也可以通过“暴 力”的方式解决,但是工作效率会大大折扣。所以,为极大提高办公效率,就谋生了这个想法。

二、GUI界面设计

使用PyQt5进行界面的搭建,最终界面如下:

1.第一步:确定被读取文件所在的文件夹。

2.第二步:确定最终读取结果是否需要保留其文件类型(即后缀)。可根据个人需求而定,以我的工作经验来说,第二种“不保留”是最常见的,即只获取文件名称。

3.第三步:选择最终读取结果存放的文件类型,下拉列表中包含了最常用的五种文件类型:txt文本文件、.doc文档、.docx文档、.xls工作表和.xlsx工作表(如下图所示)。若跳过此步骤,默认保存文件类型为txt文本文件。

4.最后单击“开始读取”按钮,即可成功获取当前目录下所有文件的名称并存储在步骤三所选的文件类型中。若还想继续读取其他文件名称,从步骤一开始重复即可;否则,单击“退出系统”即可退出程序即可。

最后附上通过pyuic5产生的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", "三、请选择获取结果最终存放的文件类型:"))
        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", "退出系统"))
        self.pushButton.setText(_translate("Form", "开始读取"))
        self.label_8.setText(_translate("Form", "文件名称获取系统"))
        self.label_6.setText(_translate("Form", "一、请选择待获取文件所在的文件夹:"))
        self.pushButton_3.setText(_translate("Form", "点击选择待读取文件所在的文件夹"))
import ziyuan_rc //用于个人logo或图标显示,可根据个人需求设置,也可注掉

三、程序详解

1.导入所需模块

import sys,os
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget

from docx import Document
from openpyxl import Workbook

2.调整窗口大小

# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

这一步要额外注意:当在pyqt5中的设计界面与使用pyuic生成的界面大小不一致时,需要导入Qtcore模块实现自适应缩放。

设计界面

生成界面

加上上述代码后,两者才会变得一致。

3.弹出选择文件路径对话框

def lujing(self):
    filepath = QtWidgets.QFileDialog.getExistingDirectory(self, "选取存放待读取文件的文件夹")  # 获取文件夹的路径
    if filepath:
        self.path = filepath
        self.lujing_flag = True

此def对应着步骤一。最后设立一个标志位lujing_flag,以此来判断操作者是否完成了步骤一(后续会用到)。

对话框效果如下:

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 = []  # 存放最终读取结果
            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的内容赋给result_list;否则,通过循环定位后缀标识符“.”在对应文件名中的索引,利用此索引对此文件名依次切片,最终获得纯文件名(不保留后缀)。

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, '成功', '文件名称读取结果保存在当前目录下,请查看!')
    else:
        QtWidgets.QMessageBox.critical(self, '提示', '请完成步骤一!')

依次对步骤完成情况进行判断,并通过自定义函数wenjian_shengcheng写入并生成文件。

自定义函数wenjian_shengcheng如下:

def wenjian_shengcheng(suoyin, content):
    name = "read_result"
    # 产生不同种类的文件
    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__构造函数中定义,通过self关键字访问,每个实例拥有独立副本
        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 = []  # 存放最终读取结果
                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, '成功', '文件名称读取结果保存在当前目录下,请查看!')
        else:
            QtWidgets.QMessageBox.critical(self, '提示', '请完成步骤一!')

def wenjian_shengcheng(suoyin, content):
    name = "read_result"
    # 产生不同种类的文件
    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_())

到此这篇关于Python+PyQt实现一键生成文件目录的文章就介绍到这了,更多相关Python生成文件目录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Docker构建Python Flask程序的详细教程

    使用Docker构建Python Flask程序的详细教程

    在当今的软件开发领域,容器化技术正变得越来越流行,而 Docker 无疑是其中的佼佼者,本文我们就来聊聊如何使用 Docker 构建一个简单的 Python Flask 程序吧
    2025-07-07
  • python反编译学习之字节码详解

    python反编译学习之字节码详解

    这篇文章主要给大家介绍了关于python反编译学习之字节码的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Python NaN空值的处理示例详解

    Python NaN空值的处理示例详解

    这篇文章主要介绍了Python NaN空值的处理,通过本文的介绍,对Python去掉数组中的空值NaN有了更加深入的了解,在实际的数据分析工作中,我们可以根据具体的情况选择合,需要的朋友可以参考下
    2023-11-11
  • python实现简单贪吃蛇游戏

    python实现简单贪吃蛇游戏

    这篇文章主要为大家详细介绍了python实现简单贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Python趣味爬虫之用Python实现智慧校园一键评教

    Python趣味爬虫之用Python实现智慧校园一键评教

    你还在为智慧校园每周的评教而苦恼吗?今天我来帮你解放双手,用Python实现一键评教,从此生活无忧无虑,文中有非常详细的代码示例,需要的朋友可以参考下
    2021-05-05
  • Pytorch GPU显存充足却显示out of memory的解决方式

    Pytorch GPU显存充足却显示out of memory的解决方式

    今天小编就为大家分享一篇Pytorch GPU显存充足却显示out of memory的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • AI与Python人工智能遗传算法

    AI与Python人工智能遗传算法

    这篇文章主要为大家介绍了AI与Python人工智能遗传算法的详解教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • django应用JWT(JSON Web Token)实战教程

    django应用JWT(JSON Web Token)实战教程

    在前后端分离的项目中,JWT(JSON Web Token)作为一种广泛使用的身份验证和授权机制,提供了一种安全、高效的方式来保护RESTful API,本文详细介绍了JWT的概念、优势、在Django中的应用步骤和使用方法,是构建安全、高效Web应用的有效指南
    2024-10-10
  • Python告诉你木马程序的键盘记录原理

    Python告诉你木马程序的键盘记录原理

    今天小编就为大家分享一篇关于Python告诉你木马程序的键盘记录原理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 使用Python计算两个不同列表的相似度

    使用Python计算两个不同列表的相似度

    这篇文章主要介绍了使用Python计算两个不同列表的相似度,Python数据开发工作中的需求两个不同列表给出相似度,本文实现判断数字类型相似度和字符串类型相似度,非常实用,需要的朋友可以参考下
    2023-07-07

最新评论