批量文件名修改工具
下面我将详细介绍一个基于Python Tkinter开发的批量文件名修改工具的实现思路和关键代码。这个工具支持多种重命名操作,包括替换内容、正则替换、添加前后缀和序号重命名等功能。
功能概述
该批量重命名工具具有以下核心功能:
选择目标文件夹:浏览并选择需要重命名文件的文件夹
多种重命名模式:
替换内容(支持区分大小写)
正则表达式替换(支持忽略大小写)
添加前缀
添加后缀
序号重命名(可设置起始值、步长和位数)
实时预览:在操作前查看新旧文件名对比
安全重命名:避免文件名冲突,提供错误处理
结果反馈:显示成功/失败的重命名操作统计
界面设计与实现
主界面布局
class BatchRenamer:
def __init__(self, root):
self.root = root
self.root.title("批量文件名修改工具")
self.root.geometry("650x650")
# 文件夹路径
self.folder_path = tk.StringVar()
self.create_folder_selection()
# 操作类型选择
self.operation = tk.StringVar(value="replace")
self.create_operation_selection()
# 参数输入区域
self.create_parameter_area()
# 文件列表
self.create_file_list()
# 按钮区域
self.create_buttons()文件夹选择组件
def create_folder_selection(self):
frame = ttk.LabelFrame(self.root, text="选择文件夹")
frame.pack(fill="x", padx=10, pady=5)
ttk.Entry(frame, textvariable=self.folder_path, width=50).pack(
side="left", padx=5, pady=5, fill="x", expand=True)
ttk.Button(frame, text="浏览...", command=self.browse_folder).pack(
side="right", padx=5, pady=5)
def browse_folder(self):
folder = filedialog.askdirectory()
if folder:
self.folder_path.set(folder)
self.list_files()操作类型选择
def create_operation_selection(self):
frame = ttk.LabelFrame(self.root, text="操作类型")
frame.pack(fill="x", padx=10, pady=5)
operations = [
("替换内容", "replace"),
("正则替换", "regex_replace"),
("添加前缀", "prefix"),
("添加后缀", "suffix"),
("序号重命名", "sequence")
]
for text, mode in operations:
ttk.Radiobutton(
frame, text=text, variable=self.operation,
value=mode, command=self.update_parameters
).pack(side="left", padx=10, pady=5)动态参数区域
根据选择的操作类型动态显示不同的参数输入控件:
def update_parameters(self):
# 清除现有控件
for widget in self.param_frame.winfo_children():
widget.destroy()
op = self.operation.get()
if op == "replace":
# 替换内容参数
ttk.Label(self.param_frame, text="查找内容:").grid(row=0, column=0, padx=5, pady=5)
self.old_text = ttk.Entry(self.param_frame, width=20)
self.old_text.grid(row=0, column=1, padx=5, pady=5)
ttk.Label(self.param_frame, text="替换为:").grid(row=0, column=2, padx=5, pady=5)
self.new_text = ttk.Entry(self.param_frame, width=20)
self.new_text.grid(row=0, column=3, padx=5, pady=5)
self.case_sensitive = tk.BooleanVar(value=True)
ttk.Checkbutton(
self.param_frame, text="区分大小写",
variable=self.case_sensitive
).grid(row=0, column=4, padx=5, pady=5)
elif op == "regex_replace":
# 正则替换参数
ttk.Label(self.param_frame, text="正则表达式:").grid(row=0, column=0, padx=5, pady=5)
self.regex_pattern = ttk.Entry(self.param_frame, width=20)
self.regex_pattern.grid(row=0, column=1, padx=5, pady=5)
ttk.Label(self.param_frame, text="替换为:").grid(row=0, column=2, padx=5, pady=5)
self.regex_replacement = ttk.Entry(self.param_frame, width=20)
self.regex_replacement.grid(row=0, column=3, padx=5, pady=5)
self.regex_ignore_case = tk.BooleanVar(value=False)
ttk.Checkbutton(
self.param_frame, text="忽略大小写",
variable=self.regex_ignore_case
).grid(row=0, column=4, padx=5, pady=5)
# 正则表达式帮助提示
help_label = ttk.Label(
self.param_frame,
text="提示:使用正则表达式进行高级匹配,例如:\\.jpg$ 匹配jpg后缀,\\d+ 匹配数字",
foreground="gray"
)
help_label.grid(row=1, column=0, columnspan=5, padx=5, pady=2, sticky="w")
# 其他操作类型的参数设置...文件列表展示
使用Treeview组件展示文件列表,支持双击预览:
def create_file_list(self):
frame = ttk.LabelFrame(self.root, text="文件列表 (双击预览)")
frame.pack(fill="both", expand=True, padx=10, pady=5)
# 创建树状视图
self.tree = ttk.Treeview(frame, columns=("new_name"), show="headings")
self.tree.heading("#0", text="原文件名")
self.tree.heading("new_name", text="新文件名")
# 添加滚动条
scrollbar = ttk.Scrollbar(frame, orient="vertical", command=self.tree.yview)
self.tree.configure(yscrollcommand=scrollbar.set)
self.tree.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")
# 绑定双击事件
self.tree.bind("<Double-1>", self.preview_rename)核心功能实现
文件列表加载
def list_files(self):
folder = self.folder_path.get()
if not folder or not os.path.isdir(folder):
return
# 清空现有列表
for item in self.tree.get_children():
self.tree.delete(item)
# 获取文件列表(排除文件夹)
files = [f for f in os.listdir(folder) if os.path.isfile(os.path.join(folder, f))]
for file in files:
self.tree.insert("", "end", text=file, values=(file,))重命名预览
根据选择的操作类型生成新文件名:
def preview_rename(self, event=None):
folder = self.folder_path.get()
if not folder or not os.path.isdir(folder):
messagebox.showerror("错误", "请先选择有效文件夹")
return
# 获取当前文件列表
files = [self.tree.item(item, "text") for item in self.tree.get_children()]
# 根据操作类型生成新文件名
new_names = []
op = self.operation.get()
if op == "replace":
# 简单替换逻辑
old_str = self.old_text.get()
new_str = self.new_text.get()
case_sensitive = self.case_sensitive.get()
for file in files:
if case_sensitive:
new_name = file.replace(old_str, new_str)
else:
new_name = file.lower().replace(old_str.lower(), new_str)
new_names.append(new_name)
elif op == "regex_replace":
# 正则替换逻辑
pattern = self.regex_pattern.get()
replacement = self.regex_replacement.get()
ignore_case = self.regex_ignore_case.get()
if not pattern:
messagebox.showerror("错误", "正则表达式不能为空")
return
flags = re.IGNORECASE if ignore_case else 0
for file in files:
try:
new_name = re.sub(pattern, replacement, file, flags=flags)
new_names.append(new_name)
except re.error as e:
messagebox.showerror("正则表达式错误", f"无效的正则表达式: {str(e)}")
return
# 其他操作类型的处理...
# 更新Treeview显示
for i, item in enumerate(self.tree.get_children()):
self.tree.item(item, values=(new_names[i],))执行重命名
def execute_rename(self):
folder = self.folder_path.get()
if not folder or not os.path.isdir(folder):
messagebox.showerror("错误", "请先选择有效文件夹")
return
# 收集新旧文件名对应关系
rename_map = []
for item in self.tree.get_children():
old_name = self.tree.item(item, "text")
new_name = self.tree.item(item, "values")[0]
if old_name != new_name:
rename_map.append((old_name, new_name))
if not rename_map:
messagebox.showinfo("提示", "没有需要重命名的文件")
return
# 执行重命名
success_count = 0
for old_name, new_name in rename_map:
try:
old_path = os.path.join(folder, old_name)
new_path = os.path.join(folder, new_name)
# 避免文件名冲突
if os.path.exists(new_path) and old_path != new_path:
messagebox.showerror("错误", f"文件 {new_name} 已存在,重命名中止")
return
os.rename(old_path, new_path)
success_count += 1
except Exception as e:
messagebox.showerror("错误", f"重命名 {old_name} 失败: {str(e)}")
messagebox.showinfo("完成", f"成功重命名 {success_count}/{len(rename_map)} 个文件")
self.list_files() # 刷新文件列表使用示例
替换操作:
选择"替换内容"操作
输入要查找的内容和替换后的内容
预览并执行
正则替换:
选择"正则替换"操作
输入正则表达式(如
\.jpg$匹配jpg后缀)输入替换内容(如
.png)预览并执行
序号重命名:
选择"序号重命名"操作
设置起始值、步长和位数
添加前缀(可选)
预览并执行
总结
这个批量文件名修改工具通过Python的Tkinter库实现了直观的GUI界面,具有以下特点:
用户友好:清晰的界面布局,操作逻辑直观
功能全面:支持多种重命名方式,满足不同需求
安全可靠:提供预览功能,避免误操作
高效灵活:正则表达式支持复杂的重命名规则
错误处理:完善的异常捕获和用户提示
通过这个工具,用户可以高效地完成大批量文件的重命名工作,特别适合需要整理大量文件的情况,如照片整理、文档归档等场景。
工具界面效果图:
+-------------------------------------------+
| 批量文件名修改工具 |
+-------------------------------------------+
| [选择文件夹] [文件夹路径] [浏览...] |
| |
| [操作类型] (●)替换内容 ( )正则替换 (...) |
| |
| [参数设置] (根据选择的操作类型显示参数) |
| |
| [文件列表] |
| +-------------------+-------------------+ |
| | 原文件名 | 新文件名 | |
| +-------------------+-------------------+ |
| | file1.txt | new_file1.txt | |
| | image.jpg | new_image.jpg | |
| | ... | ... | |
| +-------------------+-------------------+ |
| |
| [刷新列表] [预览修改] [执行重命名] |
+-------------------------------------------+这个工具不仅提高了文件重命名的效率,还通过预览功能大大降低了操作风险。
下载
文件名批量修改V1.1.0.0:
描述:
可以替换所有某字符串为另一字符串或置空。
可以替换正则表达式所能提取的字符串为另一字符串或置空。
可以给所有文件名增加前缀。
可以个所有文件名增加后缀。
可以按照一定序号进行顺序更改文件名。
下载:
- 感谢你赐予我前进的力量

