任务描述
你是一个python高级开发人员,请用python开发一个gui应用,实现文件批量命名的功能
功能描述
- 对指定目录的文件名增加编号前缀,前缀与文件名的连接字符可通过参数配置;
- 添加编号前缀时,编号的位数可通过参数配置,编号位数不足则在前面用字符0补齐;
- 对指定目录下的所有文件名删除编号前缀和连接符,连接符可配置;如果连接符为空则只删除编号前缀即可;
- 如果文件名全部由数字组成,则文件名不变;
- 人机界面上可以选择是增加编号前缀还是删除编号前缀;
- 人机界面基于tkinter来实现,界面中有需要配置的参数设置,包括目录选择、连接符、编号位数、操作模式等
经过几次生成和反馈后的最终代码
import os
import re
import tkinter as tk
from tkinter import filedialog, messageboxclass FileRenamerApp:def __init__(self, master):self.master = masterself.master.title("文件批量重命名工具")self.master.geometry("500x300")self.directory = tk.StringVar()self.separator = tk.StringVar(value="-")self.padding = tk.IntVar(value=3)self.mode = tk.IntVar(value=1) self.create_widgets()def create_widgets(self):tk.Label(self.master, text="目标目录:", font=("TkDefaultFont", 9)).grid(row=0, column=0, sticky="e", padx=10, pady=5)tk.Entry(self.master, textvariable=self.directory, width=40, font=("TkDefaultFont", 9)).grid(row=0, column=1, padx=10, pady=5)tk.Button(self.master, text="浏览...", command=self.select_directory, font=("TkDefaultFont", 9)).grid(row=0, column=2, padx=5, pady=5)tk.Label(self.master, text="操作模式:", font=("TkDefaultFont", 9)).grid(row=1, column=0, sticky="e", padx=10, pady=5)tk.Radiobutton(self.master, text="添加编号前缀", variable=self.mode, value=1, font=("TkDefaultFont", 9)).grid(row=1, column=1, sticky="w")tk.Radiobutton(self.master, text="删除编号前缀", variable=self.mode, value=2, font=("TkDefaultFont", 9)).grid(row=1, column=2, sticky="w")tk.Label(self.master, text="连接符:", font=("TkDefaultFont", 9)).grid(row=2, column=0, sticky="e", padx=10, pady=5)tk.Entry(self.master, textvariable=self.separator, width=5, font=("TkDefaultFont", 9)).grid(row=2, column=1, sticky="w", padx=10, pady=5)tk.Label(self.master, text="编号位数:", font=("TkDefaultFont", 9)).grid(row=3, column=0, sticky="e", padx=10, pady=5)tk.Entry(self.master, textvariable=self.padding, width=5, font=("TkDefaultFont", 9)).grid(row=3, column=1, sticky="w", padx=10, pady=5)tk.Button(self.master, text="开始重命名", command=self.rename_files,bg="lightgreen", activebackground="green", font=("TkDefaultFont", 9)).grid(row=4, column=1, pady=20)def select_directory(self):"""选择目标目录"""path = filedialog.askdirectory(title="请选择目标目录")if path:self.directory.set(path)def rename_files(self):"""执行文件重命名操作"""directory = self.directory.get()separator = self.separator.get()padding = self.padding.get()mode = self.mode.get()if not directory:messagebox.showwarning("警告", "请先选择目标目录", icon='warning')returntry:files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]total_files = len(files)if total_files == 0:messagebox.showinfo("提示", "目标目录中没有可处理的文件", icon='info')returnif mode == 1: processed_count = 0for idx, filename in enumerate(sorted(files), start=1):old_path = os.path.join(directory, filename)base, ext = os.path.splitext(filename)new_filename = f"{idx:0{padding}d}{separator}{base}{ext}"new_path = os.path.join(directory, new_filename)os.rename(old_path, new_path)processed_count += 1messagebox.showinfo("成功", f"已成功处理 {processed_count} 个文件", icon='info')elif mode == 2: processed_count = 0for filename in files:if re.fullmatch(r"\d+\.\w+", filename):continuebase, ext = os.path.splitext(filename)if separator: pattern = r"^(\d+){sep}".format(sep=re.escape(separator))else: pattern = r"^(\d+)"match = re.match(pattern, base)if match:new_base = base[match.end():]new_filename = f"{new_base}{ext}"old_path = os.path.join(directory, filename)new_path = os.path.join(directory, new_filename)os.rename(old_path, new_path)processed_count += 1messagebox.showinfo("成功", f"已成功处理 {processed_count} 个文件", icon='info')except Exception as e:messagebox.showerror("错误", f"发生错误:{str(e)}", icon='error')if __name__ == "__main__":root = tk.Tk()try:default_font = ("WenQuanYi Zen Hei", 9)root.option_add("*Font", default_font)except:passapp = FileRenamerApp(root)root.mainloop()
AI补充的总结
功能概述
- 添加编号前缀:为文件名添加带补零的编号前缀(如001-文件名.txt)
- 删除编号前缀:移除文件名开头的编号及连接符(如001-文件名.txt → 文件名.txt)
- 支持复杂文件名:正确处理包含点、下划线等特殊字符的文件名
- 保留扩展名:始终保留原始文件扩展名
操作步骤
- 点击"浏览…"选择目标文件夹
- 选择操作模式(添加/删除编号前缀)
- 配置连接符(如-)和编号位数(如3)
- 点击"开始重命名"执行操作
注意事项
- 备份数据:首次使用时建议先备份重要文件
- 文件排序:文件会按字母顺序处理,建议确保文件名有规律
- 权限问题:如果遇到权限错误,请以管理员身份运行程序
- 特殊字符:避免在连接符中使用正则表达式特殊字符(如.、*等)
示例场景
场景 | 输入文件名 | 连接符 | 输出文件名 |
---|
添加编号 | 文件名.txt | - | 001-文件名.txt |
删除编号 | 001-文件名.txt | - | 文件名.txt |
复杂文件名 | 015.1512-20250708.1513_0006.csv | . | 1512-20250708.1513_0006.csv |
测试用例
输入文件名 | 连接符 | 预期输出 |
---|
015.1512-20250708.1513_0006.csv | . | 1512-20250708.1513_0006.csv |
123测试文件.txt | 空 | 测试文件.txt |
001-测试文件.txt | - | 测试文件.txt |
测试文件.txt | 空 | 不做修改 |
12345.txt | 空 | 不做修改 |