登录/注册

文件批量改名工具

更多

文件批量改名工具

下面是一个使用Python和PyQt5开发的图形化文件批量改名工具。这个工具支持多种重命名方式,包括添加前缀/后缀、替换文本、序列编号等。

import sys
import os
import re
import shutil
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class FileRenamer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setWindowTitle("文件批量改名工具 v1.0")
        self.resize(900, 600)

    def initUI(self):
        # 创建主窗口控件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)

        # 文件选择区域
        file_group = QGroupBox("文件选择")
        file_layout = QHBoxLayout(file_group)

        self.dir_edit = QLineEdit()
        self.dir_edit.setPlaceholderText("请选择目录...")
        file_layout.addWidget(self.dir_edit)

        browse_btn = QPushButton("浏览...")
        browse_btn.clicked.connect(self.browse_directory)
        file_layout.addWidget(browse_btn)

        refresh_btn = QPushButton("刷新")
        refresh_btn.clicked.connect(self.load_files)
        file_layout.addWidget(refresh_btn)

        main_layout.addWidget(file_group)

        # 文件列表区域
        self.file_table = QTableWidget()
        self.file_table.setColumnCount(3)
        self.file_table.setHorizontalHeaderLabels(["原文件名", "新文件名", "状态"])
        self.file_table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
        self.file_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
        self.file_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
        self.file_table.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.file_table.setEditTriggers(QAbstractItemView.NoEditTriggers)

        main_layout.addWidget(self.file_table)

        # 重命名选项区域
        options_group = QGroupBox("重命名选项")
        options_layout = QGridLayout(options_group)

        # 添加前缀选项
        options_layout.addWidget(QLabel("添加前缀:"), 0, 0)
        self.prefix_edit = QLineEdit()
        self.prefix_edit.setPlaceholderText("输入要添加的前缀")
        options_layout.addWidget(self.prefix_edit, 0, 1)

        # 添加后缀选项
        options_layout.addWidget(QLabel("添加后缀:"), 1, 0)
        self.suffix_edit = QLineEdit()
        self.suffix_edit.setPlaceholderText("输入要添加的后缀")
        options_layout.addWidget(self.suffix_edit, 1, 1)

        # 替换文本选项
        options_layout.addWidget(QLabel("替换文本:"), 2, 0)
        self.find_edit = QLineEdit()
        self.find_edit.setPlaceholderText("查找内容")
        options_layout.addWidget(self.find_edit, 2, 1)

        options_layout.addWidget(QLabel("替换为:"), 3, 0)
        self.replace_edit = QLineEdit()
        self.replace_edit.setPlaceholderText("替换内容")
        options_layout.addWidget(self.replace_edit, 3, 1)

        # 序列号选项
        options_layout.addWidget(QLabel("序列号:"), 4, 0)
        self.serial_start = QSpinBox()
        self.serial_start.setMinimum(1)
        self.serial_start.setValue(1)
        options_layout.addWidget(self.serial_start, 4, 1)

        options_layout.addWidget(QLabel("步长:"), 5, 0)
        self.serial_step = QSpinBox()
        self.serial_step.setMinimum(1)
        self.serial_step.setValue(1)
        options_layout.addWidget(self.serial_step, 5, 1)

        options_layout.addWidget(QLabel("位数:"), 6, 0)
        self.serial_digits = QSpinBox()
        self.serial_digits.setMinimum(1)
        self.serial_digits.setValue(3)
        options_layout.addWidget(self.serial_digits, 6, 1)

        # 大小写转换
        options_layout.addWidget(QLabel("大小写:"), 7, 0)
        self.case_combo = QComboBox()
        self.case_combo.addItems(["不改变", "全部大写", "全部小写", "首字母大写"])
        options_layout.addWidget(self.case_combo, 7, 1)

        # 选项按钮
        self.keep_ext_check = QCheckBox("保持文件扩展名")
        self.keep_ext_check.setChecked(True)
        options_layout.addWidget(self.keep_ext_check, 0, 2)

        self.rename_folders = QCheckBox("包括子文件夹")
        self.rename_folders.setChecked(False)
        options_layout.addWidget(self.rename_folders, 1, 2)

        self.recursive = QCheckBox("递归处理子目录")
        self.recursive.setChecked(False)
        options_layout.addWidget(self.recursive, 2, 2)

        # 预览和应用按钮
        preview_btn = QPushButton("预览")
        preview_btn.clicked.connect(self.preview_changes)
        options_layout.addWidget(preview_btn, 8, 0)

        apply_btn = QPushButton("应用更改")
        apply_btn.clicked.connect(self.apply_changes)
        apply_btn.setStyleSheet("background-color: #4CAF50; color: white;")
        options_layout.addWidget(apply_btn, 8, 1)

        reset_btn = QPushButton("重置")
        reset_btn.clicked.connect(self.reset_options)
        options_layout.addWidget(reset_btn, 8, 2)

        main_layout.addWidget(options_group)

        # 状态栏
        self.status_bar = QStatusBar()
        self.setStatusBar(self.status_bar)
        self.status_bar.showMessage("就绪")

        # 加载示例数据
        self.load_sample_data()

    def load_sample_data(self):
        """加载示例数据用于演示"""
        self.dir_edit.setText(os.path.expanduser("~/示例文件夹"))
        self.load_files()

    def browse_directory(self):
        """浏览目录"""
        directory = QFileDialog.getExistingDirectory(self, "选择目录")
        if directory:
            self.dir_edit.setText(directory)
            self.load_files()

    def load_files(self):
        """加载目录中的文件"""
        directory = self.dir_edit.text()
        if not directory or not os.path.exists(directory):
            self.status_bar.showMessage("目录不存在!")
            return

        self.file_table.setRowCount(0)

        # 遍历目录中的文件
        for root, dirs, files in os.walk(directory):
            for file in files:
                row = self.file_table.rowCount()
                self.file_table.insertRow(row)
                self.file_table.setItem(row, 0, QTableWidgetItem(os.path.join(root, file)))
                self.file_table.setItem(row, 1, QTableWidgetItem(""))
                self.file_table.setItem(row, 2, QTableWidgetItem("等待处理"))

            if not self.recursive.isChecked():
                break

        self.status_bar.showMessage(f"已加载 {self.file_table.rowCount()} 个文件")

    def preview_changes(self):
        """预览重命名效果"""
        prefix = self.prefix_edit.text()
        suffix = self.suffix_edit.text()
        find_text = self.find_edit.text()
        replace_text = self.replace_edit.text()
        serial_start = self.serial_start.value()
        serial_step = self.serial_step.value()
        serial_digits = self.serial_digits.value()
        keep_ext = self.keep_ext_check.isChecked()
        case_option = self.case_combo.currentIndex()

        # 处理每一行
        for row in range(self.file_table.rowCount()):
            old_path = self.file_table.item(row, 0).text()
            old_name = os.path.basename(old_path)

            # 分离文件名和扩展名
            if keep_ext:
                name, ext = os.path.splitext(old_name)
            else:
                name, ext = old_name, ""

            # 应用替换
            if find_text:
                name = name.replace(find_text, replace_text)

            # 应用前缀和后缀
            name = prefix + name + suffix

            # 应用序列号
            serial = serial_start + row * serial_step
            serial_str = f"{serial:0{serial_digits}d}"
            name = f"{serial_str}_{name}"

            # 应用大小写转换
            if case_option == 1:  # 全部大写
                name = name.upper()
            elif case_option == 2:  # 全部小写
                name = name.lower()
            elif case_option == 3:  # 首字母大写
                name = name.capitalize()

            # 组合新文件名
            new_name = name + ext

            # 更新表格
            self.file_table.setItem(row, 1, QTableWidgetItem(os.path.join(os.path.dirname(old_path), new_name)))
            self.file_table.setItem(row, 2, QTableWidgetItem("已预览"))

            # 设置行颜色
            for col in range(3):
                self.file_table.item(row, col).setBackground(QColor(255, 255, 220))

        self.status_bar.showMessage("预览完成,检查新文件名")

    def apply_changes(self):
        """应用重命名操作"""
        renamed_count = 0
        error_count = 0

        for row in range(self.file_table.rowCount()):
            old_path = self.file_table.item(row, 0).text()
            new_path = self.file_table.item(row, 1).text()

            if not os.path.exists(old_path):
                self.file_table.setItem(row, 2, QTableWidgetItem("源文件不存在"))
                self.file_table.item(row, 2).setBackground(QColor(255, 200, 200))
                error_count += 1
                continue

            if old_path == new_path:
                self.file_table.setItem(row, 2, QTableWidgetItem("未更改"))
                continue

            try:
                # 创建目标目录(如果不存在)
                os.makedirs(os.path.dirname(new_path), exist_ok=True)

                # 执行重命名
                shutil.move(old_path, new_path)

                # 更新状态
                self.file_table.setItem(row, 2, QTableWidgetItem("已重命名"))
                self.file_table.item(row, 2).setBackground(QColor(220, 255, 220))
                renamed_count += 1

                # 更新原路径显示
                self.file_table.item(row, 0).setText(new_path)
            except Exception as e:
                self.file_table.setItem(row, 2, QTableWidgetItem(f"错误: {str(e)}"))
                self.file_table.item(row, 2).setBackground(QColor(255, 200, 200))
                error_count += 1

        msg = f"操作完成! 成功重命名 {renamed_count} 个文件"
        if error_count > 0:
            msg += f", {error_count} 个错误"

        self.status_bar.showMessage(msg)
        QMessageBox.information(self, "操作完成", msg)

    def reset_options(self):
        """重置选项"""
        self.prefix_edit.clear()
        self.suffix_edit.clear()
        self.find_edit.clear()
        self.replace_edit.clear()
        self.serial_start.setValue(1)
        self.serial_step.setValue(1)
        self.serial_digits.setValue(3)
        self.case_combo.setCurrentIndex(0)

        # 重置表格
        for row in range(self.file_table.rowCount()):
            self.file_table.setItem(row, 1, QTableWidgetItem(""))
            self.file_table.setItem(row, 2, QTableWidgetItem("等待处理"))
            for col in range(3):
                if self.file_table.item(row, col):
                    self.file_table.item(row, col).setBackground(QColor(255, 255, 255))

        self.status_bar.showMessage("选项已重置")

if __name__ == "__main__":
    app = QApplication(sys.argv)

    # 设置应用样式
    app.setStyle("Fusion")
    palette = QPalette()
    palette.setColor(QPalette.Window, QColor(240, 240, 240))
    palette.setColor(QPalette.WindowText, QColor(0, 0, 0))
    app.setPalette(palette)

    # 设置全局字体
    font = QFont()
    font.setFamily("Microsoft YaHei")
    font.setPointSize(10)
    app.setFont(font)

    window = FileRenamer()
    window.show()
    sys.exit(app.exec_())

工具功能说明

这个文件批量改名工具提供了以下功能:

  1. 文件选择

    • 浏览并选择要处理的目录
    • 刷新文件列表
    • 显示文件列表(原文件名、新文件名和状态)
  2. 重命名选项

    • 添加前缀/后缀
    • 查找并替换文本
    • 序列号生成(可设置起始值、步长和位数)
    • 大小写转换(全部大写、全部小写、首字母大写)
    • 保持文件扩展名
    • 递归处理子目录
    • 包括子文件夹
  3. 操作流程

    • 预览更改效果,在表格中显示新文件名
    • 应用更改执行实际重命名操作
    • 重置选项恢复默认设置
  4. 状态反馈

    • 显示操作结果和错误信息
    • 使用颜色标识不同状态(等待处理、已预览、已重命名、错误等)

使用说明

  1. 通过"浏览..."按钮选择要处理的目录
  2. 根据需要设置重命名选项:
    • 添加前缀/后缀
    • 替换文件名中的特定文本
    • 使用序列号重新编号文件
    • 调整文件名大小写
  3. 点击"预览"按钮查看重命名效果
  4. 检查新文件名是否符合预期
  5. 点击"应用更改"执行重命名操作
  6. 如需重新设置,点击"重置"按钮清除所有选项

这个工具提供了直观的界面和丰富的重命名选项,可以满足大多数文件批量重命名的需求。

要运行此程序,您需要安装Python和PyQt5库:

pip install pyqt5

Litestar 4D应用:光度文件批处理

Photoview模块提供了光度文件批量处理的功能,方便用户对光度文件中的极坐标图、等照度图、光谱、技术参数表、道路数据等进行快速的提取。 a)打开Photoview模块,应用Dir to Dir

2025-03-13 08:56:14

KiCad 9 探秘(七):使用 Jobset 批量输出文档(归档)

“  Jobset 类似于 AD 中的 Output Job,可以根据自己的配置文件批量输出所需的文档。既减少了手动操作的工作量,也确保了输出文档的一致性。   ” Jobset 可以干什么

2025-02-12 12:01:24

SOLIDWORKS高级BOM及属性批量导入工具

SOLIDWORKS BOM插件-SolidKits.BOMs工具可以准确、规范、便捷的一键完成各种结构BOM导出,汇总BOM生成,批量导入属性,自动建立结构,实现规范化管理,并自定义打包操作,还可根据企业需求定制模

2024-12-02 16:11:59

PDF文件批量打印源代码

压缩包中包含可批量打印PDF文件的Python代码,可以借助PYcharm工具执行,实现多PDF

资料下载 jf_53975013 2024-08-08 14:26:32

坐标文件

华秋DFM是国内首款免费的PCB设计可制造性分析软件,是面向PCB工程师、硬件工程师、PCB工厂、SMT工厂、PCB贸易商的一款必备的桌面工具,精准定位设计隐患,提供优化方案,生产所需的标准工具文件只需一键完成。

资料下载 佚名 2021-07-28 18:37:54

拼版工具

华秋DFM是国内首款免费的PCB设计可制造性分析软件,是面向PCB工程师、硬件工程师、PCB工厂、SMT工厂、PCB贸易商的一款必备的桌面工具,精准定位设计隐患,提供优化方案,生产所需的标准工具文件只需一键完成。

资料下载 ah此生不换 2021-07-28 18:37:29

如何使用python实现批量删除文件名中的未知字符

本文档的主要内容详细介绍的是如何使用python实现批量删除文件名中的未知字符。

资料下载 佚名 2020-10-28 16:54:00

Protel99se如何批量更改文件属性详细教程说明

本文档的主要内容详细介绍的是Protel99se如何批量更改文件属性详细教程说明

资料下载 ah此生不换 2019-07-19 17:48:45

芯片开发必备工具——好用的文件比对工具有哪些?

芯片开发必备工具——好用的文件比对工具有哪些?

2024-11-01 08:11:18

批量替换多个文件中特定字符串的3种方法

在验证工作中我们经常遇到批量处理某些文件,或者某些文件中关键词的问题,如果单个打开编辑,效率就太低,本文分享3种简单易用的

2024-01-09 10:36:01

批量漏洞挖掘工具安装教程

介绍 QingScan一个批量漏洞挖掘工具,黏合各种好用的扫描器。 是一款聚合扫描器,本身不生产安全扫描功能,但会作为一个安全扫描工具的搬运工;

2023-06-12 09:12:05

Windows系统串口批量出厂测试工具

​ WCHUsbSerTest是一款用于WCH USB转串口系列产品出厂测试的工具软件,方便用户对产品进行批量化功能测试。

2023-04-12 11:48:36

一款批量ShiroKey检测爆破工具介绍

在项目文件夹使用 go build 编译 ShiroKeyCheck.exe -f urls.txt 批量扫描 urls.txt 中的目标

2022-09-13 09:03:27

CAD中怎么修改图块名称?CAD图块改名教程

依然保留,命令支持先选择后执行。具体操作步骤如下:首先打开浩辰CAD建筑人家,然后找到并依次点击通用工具→图块工具→图块改名(TKGM)。单击菜

2021-03-31 16:39:29

迅捷音频转化器:将其他格式的音频文件转为MP3

MP3的音频格式在我们的日常生活中会经常用到,那如何把其他格式的音频文件批量转为MP3?下面小丽将通过使用音频转换的功能,向大家介绍一款实用的迅捷音频转换器软件。

2020-06-27 14:49:00

7天热门专题 换一换
相关标签