一、 源起

  女友上班有时需要新建多个名称类似(英文/中文前缀+数字后缀)的文件夹,修改某个目录下所有文件/文件夹的名称,修改某个目录下所有文件的格式为指定格式,如果直接复制粘贴,挨个修改名称及格式的话确实令人不太愉快,所以想着做一个工具解决一下这个问题。

二、 成果展示

  按着她的要求,简单操作,页面简洁,然后还要有我们的照片做背景,我想好像这要求也不过分,就去找了网上类似的工具介绍,大概知道是要做一个桌面应用,以及应用上应该有的部件。结合自己的背景,最后决定用pycharm+pyqt5做这个工具,做出来差不多是一个41.3M的exe文件,具体功能展示如下:

批量新建指定名称(前缀+数字+后缀)文件夹

修改pycharm中temp文件夹的位置_批量修改


批量新建指定名称文件夹.gif

  前缀和后缀都可以不写;数字为整数,默认从1开始编号,前后两个空分别为其上下限。

批量修改文件夹名称为(前缀+数字+后缀)的形式

修改pycharm中temp文件夹的位置_后缀_02


批量修改文件夹名称.gif

批量修改文件名称及格式

修改pycharm中temp文件夹的位置_背景图片_03


批量修改文件名称及格式.gif

  此处通过修改文件后缀名的方式修改其格式,修改名字方式同文件夹。

三、 实现工具

界面设计工具:qt-designer

  窗口及布局设置主要由anaconda3自带的qt-designer完成,其位置在anaconda3安装目录的:\Library\bin下,在本机的目录如下:D:\appliment\anaconda3\Library\bin\designer.exe。使用时可以在该目录下双击designer.exe,也可以将该工具加入pycharm的扩展工具包中,方便调用。Qt-designer介绍及pycharm配置扩展工具

代码工具:pycharm(带pyuic、pyrcc)

  利用qt-designer制作好布局后,会生成一个ui文件,利用pycharm的pyuic扩展工具将其转换为python可执行的py文件,然后在pycharm中编写相关代码,这时可以在pycharm中执行该程序,并实现相应功能。如果需要设置背景图片,则需要先在qt-designer中添加,建议新建一个textEdit,在该textEdit内插入背景图片,再将所有部件复制粘贴到该textEdit内。此时需要新建一个qrc文件,用来记录背景图片的路径等信息,利用pycharm中的pyrcc扩展工具将该qrc文件转换为py文件,再按上一段的操作进行。在pycharm中配置pyuic工具。配置pyrcc扩展工具的方式和pyuic类似,可以选择pycharm工作路径下的pyrcc.exe作为其执行程序(或者anaconda3下的相应路径),具体参数见如下:

修改pycharm中temp文件夹的位置_背景图片_04


pyrcc扩展工具路径

打包成exe文件:conda 下(或cmd)执行pyinstaller命令

  写好代码后需要在主程序目录下,打开conda操作台(或者cmd终端),执行pyinstaller命令进行打包操作。如果未安装pyinstaller程序,需要先安装:pip install pyinstaller,接着执行pyinstaller -F -w -i 图标路径 xxx.py。参数说明:-F:生成单个可执行文件 -w:去掉命令行窗口,在GUI界面时使用效果极好 -i:指定可执行文件的应用图标,图片格式需要转换为.ico。最后可以在当前目录的dist文件下找到可执行的exe文件。这部分详情可见:
  这部分应该也可以在pycharm中利用扩展工具完成,但数次尝试均告失败,如果有人尝试成功了,麻烦告知我一下。

四、 主程序代码

import sys
import os
from generater import Ui_Form 
#generater 是ui文件转换生成的py文件
from PyQt5.QtWidgets import QApplication, QMainWindow ,QFileDialog

class mymainform(QMainWindow,Ui_Form):
    def __init__(self):
        super(mymainform,self).__init__()
        self.setupUi(self)
        self.pushButton_3.clicked.connect(self.getdir)
        self.pushButton.clicked.connect(self.createdir)
        self.pushButton_4.clicked.connect(self.modifydir)
        self.pushButton_5.clicked.connect(self.modify_file_name)
        
    def getdir(self):
        directory = QFileDialog.getExistingDirectory(self, "请选择文件夹路径", "C:\\Users")
        self.lineEdit_5.setText(directory)

    def modifydir(self):
        path = str(self.lineEdit_5.text())
        path = path.strip()
        dirs = os.listdir(path)
        if isinstance(self.lineEdit_2.text(),int):
            number = int(self.lineEdit_2.text())
        else:
            number = 1
        showstr = ""
        for dir in dirs:
            oldname = os.path.join(path,dir)
            newname = os.path.join(path,pre_name + str(number) + post_name)
            os.rename(oldname,newname)
            showstr += dir + ", 其名称已被修改为  " + pre_name + str(number) + post_name + "\n"
            number += 1
        self.textBrowser.setText(showstr)

    def createdir(self):
        pre_name = str(self.lineEdit_4.text())
        post_name = str(self.lineEdit_6.text())
        number_lower = int(self.lineEdit_2.text())
        number_upper = int(self.lineEdit_3.text())
        path = str(self.lineEdit_5.text())
        path = path.strip()
        showstr = ""
        for i in range(number_lower - 1, number_upper):
            file_name = pre_name + str(i + 1) + post_name
            dir_name = path + '/' + file_name
            isExists = file_name in os.listdir(path)
            if not isExists:
                os.makedirs(dir_name)
                showstr += dir_name + ' 创建成功' + "\n"
            else:
                showstr += dir_name + ' 目录已存在' + "\n"
        self.textBrowser.setText(showstr)
        
    def modify_file_name(self):
        pre_name = str(self.lineEdit_4.text())
        post_name = str(self.lineEdit_6.text())
        path = str(self.lineEdit_5.text())
        path = path.strip()
        if isinstance(self.lineEdit_2.text(), int):
            number = int(self.lineEdit_2.text())
        else:
            number = 1
        file_format = str(self.lineEdit_7.text())
        files = os.listdir(path)
        showstr = ""
        for file in files:
            oldname = os.path.join(os.path.abspath(path), file)
            newname = os.path.join(os.path.abspath(path), pre_name + str(number) + post_name + file_format)
            os.rename(oldname, newname)
            showstr += file + ", 已被修改为  " + pre_name + str(number) + post_name + file_format + "\n"
            number += 1
        self.textBrowser.setText(showstr)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mywin = mymainform()
    mywin.show()
    sys.exit(app.exec_())

五、参考资源