功能设计
我们的批量重命名工具将包含以下功能:
- 选择文件目录: 用户可以选择需要重命名的文件所在的目录。
- 正则表达式匹配: 用户可以使用正则表达式来匹配需要修改的文件名部分。
- 替换规则: 用户可以输入替换规则,将匹配到的部分替换成新的内容。
- 预览功能: 工具会显示重命名后的文件名,方便用户确认。
- 执行重命名: 用户确认后,工具会执行重命名操作。
最终效果:
代码示例
#RenameTool.py
import os
import re
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QLabel, QFileDialog, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import Qt
class BatchRenameTool(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('批量重命名工具')
self.setGeometry(100, 100, 600, 400)
self.initUI()
def initUI(self):
layout = QVBoxLayout()
# 用户选择文件夹
self.folder_btn = QPushButton('选择文件夹', self)
self.folder_btn.clicked.connect(self.select_folder)
layout.addWidget(self.folder_btn)
# 显示选中的文件夹路径
self.folder_label = QLabel('未选择文件夹', self)
layout.addWidget(self.folder_label)
# 文件重命名正则表达式
self.regex_label = QLabel('正则表达式:', self)
self.regex_input = QLineEdit(self)
layout.addWidget(self.regex_label)
layout.addWidget(self.regex_input)
self.replace_label = QLabel("替换规则:")
self.replace_edit = QLineEdit()
layout.addWidget(self.replace_label)
layout.addWidget(self.replace_edit)
# 预览文件表格
self.file_table = QTableWidget(self)
self.file_table.setColumnCount(2)
self.file_table.setHorizontalHeaderLabels(['原文件名', '新文件名'])
layout.addWidget(self.file_table)
# 预览按钮
self.preview_btn = QPushButton('预览重命名', self)
self.preview_btn.clicked.connect(self.preview_rename)
layout.addWidget(self.preview_btn)
# 执行重命名按钮
self.rename_btn = QPushButton('执行重命名', self)
self.rename_btn.clicked.connect(self.rename_files)
layout.addWidget(self.rename_btn)
self.setLayout(layout)
def select_folder(self):
folder = QFileDialog.getExistingDirectory(self, '选择文件夹')
if folder:
self.folder_label.setText(folder)
self.folder_path = folder
self.update_file_list()
def update_file_list(self):
self.file_list = os.listdir(self.folder_path)
self.file_table.setRowCount(len(self.file_list))
for i, file_name in enumerate(self.file_list):
self.file_table.setItem(i, 0, QTableWidgetItem(file_name))
self.file_table.setItem(i, 1, QTableWidgetItem(file_name))
def preview_rename(self):
regex_pattern = self.regex_input.text()
if not regex_pattern:
return
try:
compiled_pattern = re.compile(regex_pattern)
for i, file_name in enumerate(self.file_list):
new_name = compiled_pattern.sub(self.replace_edit.text(), file_name)
self.file_table.setItem(i, 1, QTableWidgetItem(new_name))
except re.error:
self.regex_label.setText('无效的正则表达式!')
def rename_files(self):
regex_pattern = self.regex_input.text()
if not regex_pattern:
return
try:
compiled_pattern = re.compile(regex_pattern)
for i, file_name in enumerate(self.file_list):
new_name = compiled_pattern.sub(self.replace_edit.text(), file_name)
old_file_path = os.path.join(self.folder_path, file_name)
new_file_path = os.path.join(self.folder_path, new_name)
os.rename(old_file_path, new_file_path)
self.update_file_list()
except re.error:
self.regex_label.setText('无效的正则表达式!')
if __name__ == '__main__':
app = QApplication(sys.argv)
tool = BatchRenameTool()
tool.show()
sys.exit(app.exec_())