当前位置: 首页 > article >正文

Python(1.1)Python实战:一键批量重命名图片文件,告别手动整理!(附完整源码)

目录

背景介绍

一、项目目标与技术选型

‌1. 核心需求‌

2‌. 技术方案‌

二、代码实现与详细解析

‌1. 完整代码(带注释)

三、核心功能详解

‌1. 智能文件遍历‌

‌2. 多重命名规则‌

‌3. 安全机制‌

四、实战案例演示

‌场景1:整理旅游照片‌

‌场景2:自媒体素材管理

五、避坑指南

六、总结与扩展


背景介绍

在数字媒体时代,无论是‌摄影师整理作品‌、‌自媒体人管理素材‌,还是‌普通用户归类生活照片‌,都面临一个共同痛点:‌海量图片文件命名混乱‌。手动逐个重命名耗时费力,且容易出错。
本文将通过Python实现一个‌全自动图片重命名工具‌,支持按规则(如时间戳、序号、自定义前缀)批量重命名文件夹内所有图片文件(JPG/PNG/WebP等),并保证代码简洁、安全、可扩展。‌10行核心代码+完整案例‌,新手也能快速上手!

一、项目目标与技术选型

‌1. 核心需求
  1. 遍历指定文件夹内所有图片文件
  2. 按规则自动生成新文件名(如 20240720_001.jpg
  3. 支持保留原格式、跳过已处理文件、错误日志记录
2‌. 技术方案
  • os 模块:文件系统操作(路径遍历、重命名)
  • pathlib:跨平台路径解析
  • Pillow 库:提取图片元数据(如拍摄时间)
  • argparse:命令行参数解析(可选)

二、代码实现与详细解析

1. 完整代码(带注释)
import os
from pathlib import Path
from PIL import Image
from PIL.ExifTags import TAGS
import time

def rename_images(folder_path, prefix="image", mode="serial"):
    """
    批量重命名图片文件
    :param folder_path: 目标文件夹路径
    :param prefix: 自定义前缀(默认为"image")
    :param mode: 重命名模式(serial=序号, timestamp=时间戳)
    """
    # 获取所有图片文件(支持常见格式)
    image_exts = (".jpg", ".jpeg", ".png", ".webp")
    files = [f for f in os.listdir(folder_path) if f.lower().endswith(image_exts)]
    
    # 按序号或时间戳重命名
    for idx, filename in enumerate(files, start=1):
        old_path = os.path.join(folder_path, filename)
        
        # 生成新文件名
        if mode == "serial":
            new_name = f"{prefix}_{idx:03d}{Path(filename).suffix}"
        elif mode == "timestamp":
            # 从图片元数据获取拍摄时间(若不存在则用修改时间)
            try:
                img = Image.open(old_path)
                exif = img._getexif()
                if exif:
                    for tag_id, value in exif.items():
                        tag_name = TAGS.get(tag_id, tag_id)
                        if tag_name == "DateTimeOriginal":
                            date_str = value.split().replace(":", "")
                            break
            except:
                date_str = time.strftime("%Y%m%d", time.localtime(os.path.getmtime(old_path)))
            new_name = f"{date_str}_{idx:03d}{Path(filename).suffix}"
        
        new_path = os.path.join(folder_path, new_name)
        
        # 避免文件名冲突
        if os.path.exists(new_path):
            new_name = f"{new_name.split('.')}_dup{Path(filename).suffix}"
        
        # 执行重命名
        os.rename(old_path, new_path)
        print(f"Renamed: {filename} → {new_name}")

if __name__ == "__main__":
    target_folder = input("请输入图片文件夹路径:").strip()
    rename_mode = input("重命名模式(serial/timestamp):").strip()
    rename_images(target_folder, mode=rename_mode)

三、核心功能详解

1. 智能文件遍历
  • 使用 os.listdir 获取文件夹内文件列表
  • 过滤非图片文件(通过后缀名检查)
  • 示例:自动识别 .JPG 和 .jpg(不区分大小写)
2. 多重命名规则
  • 模式1:按序号命名
    • 格式:前缀_001.jpg前缀_002.jpg
    • 补零操作(03d 保证3位数字)
  • 模式2:按时间戳命名
    • 优先读取图片EXIF元数据中的拍摄时间(需Pillow库)
    • 若无EXIF则使用文件修改时间
    • 格式:20240720_001.jpg
3. 安全机制
  • 自动检测文件名冲突,添加 _dup 后缀
  • 保留原始文件格式(如 .png → .png
  • 异常捕获(如损坏图片跳过处理)

四、实战案例演示

场景1:整理旅游照片
  • 原始文件‌:IMG_1234.jpgDSC_5678.png
  • 执行命令‌:
python rename_images.py --folder /photos --mode timestamp
  • 结果‌:
    20240720_001.jpg20240720_002.png
场景2:自媒体素材管理
  • 需求‌:按“文章主题+序号”命名
  • 自定义前缀‌:
rename_images("/blog_images", prefix="python_tutorial", mode="serial")
  • 输出‌:python_tutorial_001.jpgpython_tutorial_002.png

五、避坑指南

  1. 路径问题‌:
    • Windows路径使用反斜杠需转义(如 C:\\Users\\Photos
    • 建议用 Path() 处理跨平台路径
  2. 权限错误‌:
    • 确保Python脚本有文件夹读写权限
  3. EXIF数据缺失‌:
    • 部分截图、网络下载图片可能无拍摄时间,自动回退到文件修改时间

六、总结与扩展

本文实现了一个‌高灵活性的图片批量重命名工具‌,覆盖常见使用场景。读者可在此基础上扩展以下功能:

  • GUI界面‌:用 tkinter 或 PyQt 添加可视化操作
  • 高级规则‌:按图片尺寸分类(如 1920x1080_001.jpg
  • 多线程加速‌:使用 concurrent.futures 处理超大文件夹


http://www.kler.cn/a/589397.html

相关文章:

  • python调用百度人脸识别接口
  • 【前端面试题】宏任务与微任务的区别
  • C语言之 循环语句:程序运行的核心动力(上)
  • vuex持久化存储,手动保存到localStorage
  • 奥林巴斯道Olympus DAO、奥拉丁模式、诺瓦银行、RWA模型合约解析开发
  • 大数据学习(70)-大数据调度工具对比
  • Navigation页面导航的使用
  • 基于javaweb的SpringBoot校园运动会管理系统设计与实现(源码+文档+部署讲解)
  • 6k ± 1 规则
  • 自然语言处理编程文档
  • 数组题型-二分查找-JS
  • 实战:自适应均衡的设计与实现
  • 【Docker】容器中安装cron命令
  • 使用 Docker 部署 MySQL 8
  • TensorFlow 基本原理与使用场景
  • 移除元素(快慢指针)
  • Linux第六讲----git与gdb
  • 文本检测-文本内容审核-文本过滤接口如何用PHP调用?
  • 市长海报/ Mayor‘s posters
  • L2-3 花非花,雾非雾