下面我将详细介绍一个基于Python Tkinter开发的批量文件名修改工具的实现思路和关键代码。这个工具支持多种重命名操作,包括替换内容、正则替换、添加前后缀和序号重命名等功能。

功能概述

该批量重命名工具具有以下核心功能:

  1. 选择目标文件夹:浏览并选择需要重命名文件的文件夹

  2. 多种重命名模式

    • 替换内容(支持区分大小写)

    • 正则表达式替换(支持忽略大小写)

    • 添加前缀

    • 添加后缀

    • 序号重命名(可设置起始值、步长和位数)

  3. 实时预览:在操作前查看新旧文件名对比

  4. 安全重命名:避免文件名冲突,提供错误处理

  5. 结果反馈:显示成功/失败的重命名操作统计

界面设计与实现

主界面布局

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()  # 刷新文件列表

使用示例

  1. 替换操作

    • 选择"替换内容"操作

    • 输入要查找的内容和替换后的内容

    • 预览并执行

  2. 正则替换

    • 选择"正则替换"操作

    • 输入正则表达式(如\.jpg$匹配jpg后缀)

    • 输入替换内容(如.png

    • 预览并执行

  3. 序号重命名

    • 选择"序号重命名"操作

    • 设置起始值、步长和位数

    • 添加前缀(可选)

    • 预览并执行

总结

这个批量文件名修改工具通过Python的Tkinter库实现了直观的GUI界面,具有以下特点:

  1. 用户友好:清晰的界面布局,操作逻辑直观

  2. 功能全面:支持多种重命名方式,满足不同需求

  3. 安全可靠:提供预览功能,避免误操作

  4. 高效灵活:正则表达式支持复杂的重命名规则

  5. 错误处理:完善的异常捕获和用户提示

通过这个工具,用户可以高效地完成大批量文件的重命名工作,特别适合需要整理大量文件的情况,如照片整理、文档归档等场景。

工具界面效果图

+-------------------------------------------+
| 批量文件名修改工具                         |
+-------------------------------------------+
| [选择文件夹] [文件夹路径] [浏览...]        |
|                                           |
| [操作类型] (●)替换内容 ( )正则替换 (...)   |
|                                           |
| [参数设置] (根据选择的操作类型显示参数)     |
|                                           |
| [文件列表]                                |
| +-------------------+-------------------+ |
| | 原文件名          | 新文件名          | |
| +-------------------+-------------------+ |
| | file1.txt         | new_file1.txt     | |
| | image.jpg         | new_image.jpg     | |
| | ...               | ...               | |
| +-------------------+-------------------+ |
|                                           |
| [刷新列表] [预览修改]       [执行重命名]   |
+-------------------------------------------+

这个工具不仅提高了文件重命名的效率,还通过预览功能大大降低了操作风险。

下载

  1. 文件名批量修改V1.1.0.0:

    1. 描述:

      1. 可以替换所有某字符串为另一字符串或置空。

      2. 可以替换正则表达式所能提取的字符串为另一字符串或置空。

      3. 可以给所有文件名增加前缀。

      4. 可以个所有文件名增加后缀。

      5. 可以按照一定序号进行顺序更改文件名。

    2. 下载:

      1. 文件名批量修改.exe