文件批量改名工具
文件批量改名工具
下面是一个使用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_())
工具功能说明
这个文件批量改名工具提供了以下功能:
-
文件选择:
- 浏览并选择要处理的目录
- 刷新文件列表
- 显示文件列表(原文件名、新文件名和状态)
-
重命名选项:
- 添加前缀/后缀
- 查找并替换文本
- 序列号生成(可设置起始值、步长和位数)
- 大小写转换(全部大写、全部小写、首字母大写)
- 保持文件扩展名
- 递归处理子目录
- 包括子文件夹
-
操作流程:
- 预览更改效果,在表格中显示新文件名
- 应用更改执行实际重命名操作
- 重置选项恢复默认设置
-
状态反馈:
- 显示操作结果和错误信息
- 使用颜色标识不同状态(等待处理、已预览、已重命名、错误等)
使用说明
- 通过"浏览..."按钮选择要处理的目录
- 根据需要设置重命名选项:
- 添加前缀/后缀
- 替换文件名中的特定文本
- 使用序列号重新编号文件
- 调整文件名大小写
- 点击"预览"按钮查看重命名效果
- 检查新文件名是否符合预期
- 点击"应用更改"执行重命名操作
- 如需重新设置,点击"重置"按钮清除所有选项
这个工具提供了直观的界面和丰富的重命名选项,可以满足大多数文件批量重命名的需求。
要运行此程序,您需要安装Python和PyQt5库:
pip install pyqt5 Litestar 4D应用:光度文件批处理
Photoview模块提供了光度文件批量处理的功能,方便用户对光度文件中的极坐标图、等照度图、光谱、技术参数表、道路数据等进行快速的提取。 a)打开Photoview模块,应用Dir to Dir
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
坐标文件
华秋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
批量替换多个文件中特定字符串的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)。单击菜
迅捷音频转化器:将其他格式的音频文件转为MP3
MP3的音频格式在我们的日常生活中会经常用到,那如何把其他格式的音频文件批量转为MP3?下面小丽将通过使用音频转换的功能,向大家介绍一款实用的迅捷音频转换器软件。
2020-06-27 14:49:00
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机