Python 批量重命名工具:告别繁琐,提高效率

118 阅读1分钟

功能设计

我们的批量重命名工具将包含以下功能:

  1. 选择文件目录:  用户可以选择需要重命名的文件所在的目录。
  2. 正则表达式匹配:  用户可以使用正则表达式来匹配需要修改的文件名部分。
  3. 替换规则:  用户可以输入替换规则,将匹配到的部分替换成新的内容。
  4. 预览功能:  工具会显示重命名后的文件名,方便用户确认。
  5. 执行重命名:  用户确认后,工具会执行重命名操作。

最终效果:

image.png

代码示例

#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_())