Python如何实现图片批量重命名功能

 更新时间:2025年07月30日 09:12:11   作者:封奚泽优  
这篇文章主要为大家详细介绍了如何利用Python实现图片批量重命名功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下

主要就是自己进行标注用到的,想着要是自己一个个弄太麻烦了,还是用脚本直接实现的好。

本文介绍了一个基于Python的图片批量重命名工具。该工具使用Tkinter构建GUI界面,主要功能包括:

  • 设置文件名前缀
  • 选择输入/输出目录
  • 设置分隔符和连接符号等

用户可批量处理jpg/png等常见图片格式,程序会将重命名后的图片复制到指定目录并生成记录文件,记录新旧文件名对应关系

工具提供了错误检测机制,确保输入有效性,界面设计简洁直观,支持窗口居中显示。该程序适合需要批量处理图片文件的用户使用,操作简单且功能实用。

完整代码

import os
import shutil
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from pathlib import Path


class ImageRenamerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("图片批量重命名工具")
        self.setup_ui()
        self.center_window()

    def center_window(self):
        """居中显示窗口"""
        self.root.update_idletasks()
        width = 550  # 增大窗口宽度
        height = 600  # 增大窗口高度
        x = (self.root.winfo_screenwidth() // 2) - (width // 2)
        y = (self.root.winfo_screenheight() // 2) - (height // 2)
        self.root.geometry(f'{width}x{height}+{x}+{y}')

    def setup_ui(self):
        """设置UI界面"""
        # 设置字体
        font_style = ("Microsoft YaHei", 11)

        # 创建主框架,增加内边距
        main_frame = tk.Frame(self.root, padx=20, pady=20)
        main_frame.pack(expand=True, fill="both")

        # 文件名前缀
        tk.Label(main_frame, text="文件名前缀:", font=font_style).grid(row=0, column=0, sticky="w", pady=(0, 10))
        self.prefix_entry = tk.Entry(main_frame, font=font_style)
        self.prefix_entry.grid(row=0, column=1, sticky="ew", pady=(0, 10), padx=(10, 0))

        # 输入文件夹选择
        tk.Label(main_frame, text="输入文件夹:", font=font_style).grid(row=1, column=0, sticky="w", pady=(10, 0))
        self.input_dir_var = tk.StringVar(value=os.getcwd())
        tk.Entry(main_frame, textvariable=self.input_dir_var, font=font_style, state='readonly').grid(row=1, column=1,
                                                                                                      sticky="ew",
                                                                                                      pady=(10, 0),
                                                                                                      padx=(10, 0))
        tk.Button(main_frame, text="浏览...", command=self.select_input_dir, font=font_style).grid(row=1, column=2,
                                                                                                   pady=(10, 0),
                                                                                                   padx=(10, 0))

        # 输出文件夹选择
        tk.Label(main_frame, text="输出文件夹:", font=font_style).grid(row=2, column=0, sticky="w", pady=(10, 0))
        default_output = os.path.join(os.getcwd(), "output")
        self.output_dir_var = tk.StringVar(value=default_output)
        tk.Entry(main_frame, textvariable=self.output_dir_var, font=font_style).grid(row=2, column=1, sticky="ew",
                                                                                     pady=(10, 0), padx=(10, 0))
        tk.Button(main_frame, text="浏览...", command=self.select_output_dir, font=font_style).grid(row=2, column=2,
                                                                                                    pady=(10, 0),
                                                                                                    padx=(10, 0))

        # 分隔符选择
        tk.Label(main_frame, text="选择分隔符:", font=font_style).grid(row=3, column=0, sticky="w", pady=(10, 0))

        separators_frame = tk.Frame(main_frame)
        separators_frame.grid(row=3, column=1, sticky="w", padx=(10, 0), pady=(10, 0))

        self.separator_var = tk.StringVar(value="_")
        separators = [("下划线(_)", "_"), ("空格( )", " "), ("短横线(-)", "-"), ("点(.)", ".")]
        for i, (text, value) in enumerate(separators):
            rb = tk.Radiobutton(separators_frame, text=text, variable=self.separator_var,
                                value=value, font=font_style)
            rb.grid(row=i, column=0, sticky="w")

        # 连接符号选择
        tk.Label(main_frame, text="选择连接符号:", font=font_style).grid(row=4, column=0, sticky="w", pady=(10, 0))

        connectors_frame = tk.Frame(main_frame)
        connectors_frame.grid(row=4, column=1, sticky="w", padx=(10, 0), pady=(10, 0))

        self.connector_var = tk.StringVar(value=":")
        connectors = [("冒号(:)", ":"), ("空格( )", " "), ("短横线(-)", "-"), ("等号(=)", "=")]
        for i, (text, value) in enumerate(connectors):
            rb = tk.Radiobutton(connectors_frame, text=text, variable=self.connector_var,
                                value=value, font=font_style)
            rb.grid(row=i, column=0, sticky="w")

        # 执行按钮 - 放在底部并居中
        button_frame = tk.Frame(main_frame)
        button_frame.grid(row=5, column=0, columnspan=3, pady=(20, 0), sticky="ew")

        tk.Button(button_frame, text="开始重命名", command=self.rename_images,
                  font=font_style, bg="#4CAF50", fg="white", width=15).pack(pady=10)

        # 配置网格权重,使内容居中
        main_frame.columnconfigure(1, weight=1)

    def select_input_dir(self):
        """选择输入文件夹"""
        dir_path = filedialog.askdirectory(title="选择输入文件夹", initialdir=self.input_dir_var.get())
        if dir_path:
            self.input_dir_var.set(dir_path)

    def select_output_dir(self):
        """选择输出文件夹"""
        dir_path = filedialog.askdirectory(title="选择输出文件夹", initialdir=self.output_dir_var.get())
        if dir_path:
            self.output_dir_var.set(dir_path)

    def rename_images(self):
        """执行重命名操作"""
        prefix = self.prefix_entry.get().strip()
        if not prefix:
            messagebox.showerror("错误", "请输入文件名前缀!")
            return

        input_dir = self.input_dir_var.get()
        output_dir = self.output_dir_var.get()
        selected_separator = self.separator_var.get()
        selected_connector = self.connector_var.get()

        # 检查输入文件夹是否存在
        if not os.path.isdir(input_dir):
            messagebox.showerror("错误", f"输入文件夹不存在:\n{input_dir}")
            return

        # 获取输入目录下所有图片文件
        image_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp']
        image_files = [f for f in os.listdir(input_dir)
                       if os.path.isfile(os.path.join(input_dir, f)) and
                       os.path.splitext(f)[1].lower() in image_extensions]

        if not image_files:
            messagebox.showinfo("提示", f"输入文件夹中没有找到图片文件:\n{input_dir}")
            return

        # 创建输出文件夹
        try:
            os.makedirs(output_dir, exist_ok=True)
        except Exception as e:
            messagebox.showerror("错误", f"无法创建输出文件夹:\n{output_dir}\n错误: {str(e)}")
            return

        # 创建记录文件
        record_file = os.path.join(output_dir, 'rename_records.txt')

        try:
            with open(record_file, 'w', encoding='utf-8') as f:
                for index, old_name in enumerate(sorted(image_files), start=1):
                    # 获取文件名和扩展名
                    old_base, ext = os.path.splitext(old_name)
                    # 构建新文件名
                    new_name = f"{prefix}{selected_separator}{index}{ext}"

                    # 复制文件到输出文件夹并重命名
                    old_path = os.path.join(input_dir, old_name)
                    new_path = os.path.join(output_dir, new_name)
                    shutil.copy2(old_path, new_path)

                    # 写入记录(只保留原始文件名,不含扩展名)
                    f.write(f"{new_name}{selected_connector}{old_base}\n")

            messagebox.showinfo("完成", f"已成功重命名 {len(image_files)} 个图片文件。\n输出目录: {output_dir}")
        except Exception as e:
            messagebox.showerror("错误", f"处理过程中发生错误:\n{str(e)}")


if __name__ == "__main__":
    root = tk.Tk()
    app = ImageRenamerApp(root)
    root.mainloop()

效果图 

到此这篇关于Python如何实现图片批量重命名功能的文章就介绍到这了,更多相关Python图片重命名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Django模板中的数字自增(详解)

    基于Django模板中的数字自增(详解)

    下面小编就为大家带来一篇基于Django模板中的数字自增(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 基于Python实现植物大战僵尸游戏的示例代码

    基于Python实现植物大战僵尸游戏的示例代码

    植物大战僵尸是一款经典的塔防类游戏,玩家通过种植各种植物来抵御僵尸的攻击,本文将详细介绍如何使用Python和Pygame库来实现一个简单的植物大战僵尸游戏,文中通过代码示例讲解的非常详细,感兴趣的小伙伴跟着小编一起来看看吧
    2024-10-10
  • python中的变量与内存用法

    python中的变量与内存用法

    这篇文章主要介绍了python变量与内存用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Pytorch中torch.nn.**和torch.nn.functional.**的区别

    Pytorch中torch.nn.**和torch.nn.functional.**的区别

    本文主要介绍了Pytorch中torch.nn.**和torch.nn.functional的区别,torch.nn.**是一个继承的类,需要构造对象后再调用,而torch.nn.functional是纯数学函数,可以直接使用,下面就来详细的介绍一下
    2024-11-11
  • Python性能优化之让你的代码运行速度提升10倍的技巧分享

    Python性能优化之让你的代码运行速度提升10倍的技巧分享

    在日常开发中,我们常常会遇到Python代码运行缓慢的问题,通过一些巧妙的优化技巧,我们完全可以让代码的运行速度提升数倍甚至数十倍,下面小编就为大家介绍一下吧
    2025-11-11
  • python简单实现获取当前时间

    python简单实现获取当前时间

    最近项目中经常需要python去取当前的时间,虽然不是很难,但是老是忘记,用一次丢一次,为了能够更好的记住,我今天特意写下python 当前时间这篇文章,如果你觉的对你有用的话,可以收藏下。
    2016-08-08
  • Python切图九宫格的实现方法

    Python切图九宫格的实现方法

    这篇文章主要介绍了Python切图九宫格的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Pycharm-community-2020.2.3 社区版安装教程图文详解

    Pycharm-community-2020.2.3 社区版安装教程图文详解

    这篇文章主要介绍了Pycharm-community-2020.2.3 社区版安装教程图文详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 对Django 中request.get和request.post的区别详解

    对Django 中request.get和request.post的区别详解

    今天小编就为大家分享一篇对Django 中request.get和request.post的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python修改列表值问题解决方案

    Python修改列表值问题解决方案

    这篇文章主要介绍了Python修改列表值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论