首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python自动化:一键搞定“文件批量重命名”

Python自动化:一键搞定“文件批量重命名”

原创
作者头像
用户3044965
发布2025-11-24 11:02:40
发布2025-11-24 11:02:40
360
举报

在日常办公或整理资料时,你是否遇到过这样的崩溃时刻:

  • 下载了几百张素材图片,名字全是乱码(如 ad3f12.jpg),想改成有序的 img_001.jpg
  • 要把项目文件夹里几十个文件的“副本”字样全部删掉?
  • 想给所有备份文件加上今天的日期后缀?

核心工具与准备

不需要安装任何第三方库,我们使用Python自带的 os 模块即可完成操作。

核心函数

  • os.listdir(path): 获取指定目录下的所有文件名。
  • os.rename(src, dst): 将文件从 src(原路径)重命名为 dst(新路径)。
  • os.path.join(path, name): 智能拼接路径,兼容Windows和Mac系统。

💡 场景一:按顺序批量编号(整理照片/素材)

需求: 将乱七八糟的文件名统一修改为 前缀_序号.扩展名 的格式,例如 Photo_001.jpg

适用场景: 摄影师整理照片、深度学习数据集预处理、壁纸库整理。

📜 代码实现

Python

代码语言:javascript
复制
import os

def batch_rename_sequence(folder_path, prefix="File", start_index=1):
    # 1. 获取文件夹内所有文件
    try:
        files = os.listdir(folder_path)
    except FileNotFoundError:
        print("❌ 找不到文件夹,请检查路径!")
        return

    # 2. 循环处理每一个文件
    # enumerate生成带索引的序列,i从0开始,所以需要+start_index
    for i, filename in enumerate(files):
        # 排除隐藏文件(如Mac下的.DS_Store)
        if filename.startswith('.'):
            continue

        # 获取文件后缀名 (例如 .jpg)
        file_ext = os.path.splitext(filename)[1]
        
        # 3. 构建新名字
        # :03d 表示数字补零对齐,例如 1 -> 001, 12 -> 012
        new_name = f"{prefix}_{start_index + i:03d}{file_ext}"
        
        # 4. 拼接完整路径
        old_path = os.path.join(folder_path, filename)
        new_path = os.path.join(folder_path, new_name)
        
        # 5. 执行重命名
        os.rename(old_path, new_path)
        print(f"✅ [重命名成功]: {filename} -> {new_name}")

# --- 使用示例 ---
# 请将路径替换为你实际的文件夹路径
target_folder = r"C:\Users\Admin\Pictures\Travel"
batch_rename_sequence(target_folder, prefix="Travel_Japan", start_index=1)

场景二:关键词替换与清洗(办公文档处理)

需求: 删除文件名中多余的字符(如“ - 副本”),或者将文件名中的空格替换为下划线。

适用场景: 处理从网盘批量下载的文件、整理同事发来的命名不规范的文档。

代码实现

Python

代码语言:javascript
复制
import os

def batch_replace_keyword(folder_path, target_word, replace_word=""):
    files = os.listdir(folder_path)
    
    count = 0
    for filename in files:
        # 如果文件名中包含目标关键词
        if target_word in filename:
            # 1. 生成新文件名 (字符串替换)
            new_name = filename.replace(target_word, replace_word)
            
            # 2. 拼接路径
            old_path = os.path.join(folder_path, filename)
            new_path = os.path.join(folder_path, new_name)
            
            # 3. 避免文件名冲突 (如果新名字已经存在,则跳过)
            if os.path.exists(new_path):
                print(f"⚠️ [跳过] 目标文件已存在: {new_name}")
                continue
                
            os.rename(old_path, new_path)
            print(f"🔨 [清洗完成]: {filename} -> {new_name}")
            count += 1
            
    print(f"🎉 总计处理了 {count} 个文件。")

# --- 使用示例 ---
# 场景:把 " - 副本" 删掉,相当于替换为空字符串
work_dir = r"D:\Work\Reports\2024"
batch_replace_keyword(work_dir, target_word=" - 副本", replace_word="")

场景三:修改文件扩展名(格式转换后处理)

需求: 批量将所有的 .txt 文件后缀修改为 .md(Markdown格式),或者将 .jpeg 统一为 .jpg

适用场景: 代码工程迁移、特定软件格式兼容、日志文件处理。

代码实现

Python

代码语言:javascript
复制
import os

def batch_change_extension(folder_path, old_ext, new_ext):
    # 确保扩展名带点,例如 .txt
    if not old_ext.startswith('.'): old_ext = '.' + old_ext
    if not new_ext.startswith('.'): new_ext = '.' + new_ext
    
    files = os.listdir(folder_path)
    
    for filename in files:
        # 检查是否以旧后缀结尾
        if filename.endswith(old_ext):
            # 1. 分离文件名和后缀
            base_name = os.path.splitext(filename)[0]
            
            # 2. 组合新名字
            new_name = base_name + new_ext
            
            # 3. 执行重命名
            os.rename(
                os.path.join(folder_path, filename),
                os.path.join(folder_path, new_name)
            )
            print(f"🔄 [格式转换]: {filename} -> {new_name}")

# --- 使用示例 ---
# 场景:将文件夹内所有 .htm 文件改为 .html
web_dir = r"/var/www/html/project"
batch_change_extension(web_dir, ".htm", ".html")

🛡️ 最佳实践:如何防止“一键火葬场”?

批量重命名一旦出错,恢复起来非常麻烦(除非你有备份)。强烈建议在执行 os.rename 之前,先增加一个 “演习模式”(Dry Run)

给代码加上“安全锁”

我们可以封装一个更通用的函数,增加一个 dry_run 参数:

Python

代码语言:javascript
复制
import os

def safe_rename(folder_path, dry_run=True):
    files = os.listdir(folder_path)
    print(f"🔍 当前模式: {'演习模式 (不实际修改)' if dry_run else '实战模式 (谨慎操作)'}")
    print("-" * 40)

    for i, filename in enumerate(files):
        if filename.startswith('.'): continue
        
        # 假设逻辑是:加前缀 "2025_"
        new_name = f"2025_{filename}"
        
        if dry_run:
            # 演习模式:只打印,不执行
            print(f"👁️ [预览] {filename}  --->  {new_name}")
        else:
            # 实战模式:真正动手
            old_p = os.path.join(folder_path, filename)
            new_p = os.path.join(folder_path, new_name)
            os.rename(old_p, new_p)
            print(f"✅ [已修改] {filename}  --->  {new_name}")

# --- 使用建议 ---
# 第一步:先设为 True,运行看打印结果是否符合预期
safe_rename(r"D:\TestFiles", dry_run=True)

# 第二步:确认无误后,改为 False 再次运行
# safe_rename(r"D:\TestFiles", dry_run=False)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 核心工具与准备
    • 核心函数
  • 💡 场景一:按顺序批量编号(整理照片/素材)
    • 📜 代码实现
  • 场景二:关键词替换与清洗(办公文档处理)
    • 代码实现
  • 场景三:修改文件扩展名(格式转换后处理)
    • 代码实现
  • 🛡️ 最佳实践:如何防止“一键火葬场”?
    • 给代码加上“安全锁”
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档