一、 源起
女友上班有時需要新建多個名稱類似(英文/中文前綴+數字后綴)的文件夾,修改某個目錄下所有文件/文件夾的名稱,修改某個目錄下所有文件的格式為指定格式,如果直接復制粘貼,挨個修改名稱及格式的話確實令人不太愉快,所以想着做一個工具解決一下這個問題。
二、 成果展示
按着她的要求,簡單操作,頁面簡潔,然后還要有我們的照片做背景,我想好像這要求也不過分,就去找了網上類似的工具介紹,大概知道是要做一個桌面應用,以及應用上應該有的部件。結合自己的背景,最后決定用pycharm+pyqt5做這個工具,做出來差不多是一個41.3M的exe文件,具體功能展示如下:
批量新建指定名稱(前綴+數字+后綴)文件夾
前綴和后綴都可以不寫;數字為整數,默認從1開始編號,前后兩個空分別為其上下限。
批量修改文件夾名稱為(前綴+數字+后綴)的形式
批量修改文件名稱及格式
此處通過修改文件后綴名的方式修改其格式,修改名字方式同文件夾。
三、 實現工具
界面設計工具: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下的相應路徑),具體參數見如下:
打包成exe文件:conda 下(或cmd)執行pyinstaller命令
寫好代碼后需要在主程序目錄下,打開conda操作台(或者cmd終端),執行pyinstaller命令進行打包操作。如果未安裝pyinstaller程序,需要先安裝:pip install pyinstaller,接着執行pyinstaller -F -w -i 圖標路徑 xxx.py。參數說明:-F:生成單個可執行文件 -w:去掉命令行窗口,在GUI界面時使用效果極好 -i:指定可執行文件的應用圖標,圖片格式需要轉換為.ico。最后可以在當前目錄的dist文件下找到可執行的exe文件。這部分詳情可見:https://blog.csdn.net/weixin_44901301/article/details/105964123
這部分應該也可以在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_())
五、參考資源
- pyqt5及pycharm介紹及配置:https://www.bilibili.com/video/BV154411n79k?p=1
- qt-designer設計布局時插入背景圖片:https://blog.csdn.net/yufen9987/article/details/85611711
- 將py文件打包成exe文件:https://blog.csdn.net/weixin_44901301/article/details/105964123
- 更加簡潔的批量修改文件/文件夾名稱的python代碼:https://blog.csdn.net/liupeng19970119/article/details/102555418
- 插入背景圖片后出現ModuleNotFoundError No module named **_rc:https://blog.csdn.net/qq_42455308/article/details/106865415
- 應用圖標ico圖標庫:https://www.iconfont.cn/
- 圖片格式轉換(如svg格式轉png格式):https://www.aconvert.com/cn/image/svg-to-png/