← 返回列表

批量文件重命名工具

利用 Python 内置的 OS 模块,快速遍历指定目录下的所有文件,并根据预设规则(如添加日期前缀或修改扩展名)进行批量重命名,极大地提高了文件整理效率。

快速预览:

import os
folder = './documents'
for filename in os.listdir(folder):
    if filename.endswith('.txt'):
        new_name = 'backup_' + filename
        os.rename(os.path.join(folder, filename),
                  os.path.join(folder, new_name))

应用场景与价值

在日常工作中,我们经常需要处理大量文件的重命名任务。例如: - 整理下载的文档,统一添加日期前缀以便排序 - 批量修改照片文件名,加入拍摄地点标识 - 为备份文件统一添加 "backup_" 前缀 - 批量修改文件扩展名以适配不同软件

手动重命名不仅耗时费力,还容易出错。使用 Python 编写的批量重命名工具,只需几行代码就能在几秒内完成数百个文件的重命名操作,显著提升工作效率。

基础知识

os 模块

os 模块是 Python 的标准库之一,提供了与操作系统交互的功能。在本案例中,我们主要使用以下三个函数:

  1. os.listdir(path): 返回指定目录下所有文件和文件夹的名称列表
  2. os.rename(src, dst): 将文件或文件夹从 src 路径重命名为 dst 路径
  3. os.path.join(path, *paths): 智能地拼接路径,自动处理不同操作系统的路径分隔符差异

字符串操作

Python 字符串提供了丰富的方法: - endswith(suffix): 判断字符串是否以指定后缀结尾 - 字符串拼接: 使用 + 运算符或 f-string 格式化

代码详解

让我们逐步分析代码的执行逻辑:

import os

导入 os 模块,这是进行文件系统操作的基础。

folder = './documents'

定义目标文件夹路径。./ 表示当前工作目录下的 documents 文件夹。可以根据需求修改为绝对路径,如 /Users/username/documents

for filename in os.listdir(folder):

遍历目标文件夹中的所有文件和子文件夹名称。注意 os.listdir() 返回的是文件名而非完整路径。

    if filename.endswith('.txt'):

过滤条件:仅处理扩展名为 .txt 的文本文件。这防止了误操作其他类型的文件。

        new_name = 'backup_' + filename

生成新文件名:在原文件名前添加 backup_ 前缀。例如 report.txt 会变成 backup_report.txt

        os.rename(os.path.join(folder, filename),
                  os.path.join(folder, new_name))

执行重命名操作。os.path.join() 用于构建完整的文件路径,确保路径拼接正确。

完整代码

基础版本

import os

def batch_rename(folder_path, prefix='', suffix='', extension_filter=None):
    """
    批量重命名文件

    参数:
        folder_path: 目标文件夹路径
        prefix: 要添加的前缀
        suffix: 要添加的后缀(插入到扩展名之前)
        extension_filter: 要处理的文件扩展名,如 '.txt'。None 表示处理所有文件
    """
    if not os.path.exists(folder_path):
        print(f"错误: 文件夹 '{folder_path}' 不存在")
        return

    renamed_count = 0

    for filename in os.listdir(folder_path):
        # 构建完整路径
        old_path = os.path.join(folder_path, filename)

        # 跳过文件夹
        if os.path.isdir(old_path):
            continue

        # 如果指定了扩展名过滤,则检查
        if extension_filter and not filename.endswith(extension_filter):
            continue

        # 分离文件名和扩展名
        name, ext = os.path.splitext(filename)

        # 构建新文件名
        new_name = f"{prefix}{name}{suffix}{ext}"
        new_path = os.path.join(folder_path, new_name)

        # 检查新文件名是否已存在
        if os.path.exists(new_path):
            print(f"警告: '{new_name}' 已存在,跳过 '{filename}'")
            continue

        # 执行重命名
        os.rename(old_path, new_path)
        print(f"重命名: {filename} -> {new_name}")
        renamed_count += 1

    print(f"\n完成! 共重命名 {renamed_count} 个文件")


# 使用示例
if __name__ == "__main__":
    # 为所有 .txt 文件添加 'backup_' 前缀
    batch_rename('./documents', prefix='backup_', extension_filter='.txt')

高级版本:添加日期前缀

import os
from datetime import datetime

def batch_rename_with_date(folder_path, date_format='%Y%m%d', extension_filter=None):
    """
    批量重命名文件,添加日期前缀

    参数:
        folder_path: 目标文件夹路径
        date_format: 日期格式,默认为 YYYYMMDD
        extension_filter: 要处理的文件扩展名
    """
    current_date = datetime.now().strftime(date_format)
    prefix = f"{current_date}_"

    for filename in os.listdir(folder_path):
        old_path = os.path.join(folder_path, filename)

        if os.path.isdir(old_path):
            continue

        if extension_filter and not filename.endswith(extension_filter):
            continue

        new_name = prefix + filename
        new_path = os.path.join(folder_path, new_name)

        if not os.path.exists(new_path):
            os.rename(old_path, new_path)
            print(f"重命名: {filename} -> {new_name}")


# 使用示例
batch_rename_with_date('./documents', extension_filter='.txt')
# 结果示例: report.txt -> 20260109_report.txt

运行示例

准备测试环境

# 创建测试文件夹和文件
import os

os.makedirs('./documents', exist_ok=True)
for i in range(1, 6):
    with open(f'./documents/file{i}.txt', 'w') as f:
        f.write(f'This is test file {i}')

执行重命名

uv run main.py

预期输出

重命名: file1.txt -> backup_file1.txt
重命名: file2.txt -> backup_file2.txt
重命名: file3.txt -> backup_file3.txt
重命名: file4.txt -> backup_file4.txt
重命名: file5.txt -> backup_file5.txt

完成! 共重命名 5 个文件

扩展思路

1. 支持正则表达式替换

使用 re 模块实现更复杂的文件名模式匹配和替换:

import re

def regex_rename(folder_path, pattern, replacement):
    """使用正则表达式批量重命名"""
    for filename in os.listdir(folder_path):
        new_name = re.sub(pattern, replacement, filename)
        if new_name != filename:
            os.rename(
                os.path.join(folder_path, filename),
                os.path.join(folder_path, new_name)
            )

2. 添加撤销功能

在重命名前保存操作记录到 JSON 文件,支持一键还原:

import json

rename_log = []
for old, new in rename_operations:
    os.rename(old, new)
    rename_log.append({'old': old, 'new': new})

with open('rename_log.json', 'w') as f:
    json.dump(rename_log, f)

3. 递归处理子文件夹

使用 os.walk() 遍历所有子文件夹:

for root, dirs, files in os.walk(folder_path):
    for filename in files:
        # 处理每个文件
        pass

4. 图形界面版本

使用 tkinterPyQt 创建可视化界面,让非技术用户也能轻松使用。

5. 安全性增强

  • 添加预览模式,显示将要进行的重命名操作但不实际执行
  • 支持文件名冲突时自动添加序号
  • 添加日志记录功能,追踪所有操作历史

6. 批量修改文件扩展名

def change_extension(folder_path, old_ext, new_ext):
    """批量修改文件扩展名"""
    for filename in os.listdir(folder_path):
        if filename.endswith(old_ext):
            new_name = filename[:-len(old_ext)] + new_ext
            os.rename(
                os.path.join(folder_path, filename),
                os.path.join(folder_path, new_name)
            )

注意事项

  1. 备份重要文件: 在对重要文件进行批量重命名前,务必先备份
  2. 路径正确性: 确保文件夹路径正确,避免操作错误的目录
  3. 权限问题: 确保程序对目标文件夹有读写权限
  4. 文件名冲突: 处理好新文件名与已存在文件名冲突的情况
  5. 特殊字符: 注意不同操作系统对文件名特殊字符的限制

通过掌握这个批量文件重命名工具,你可以轻松应对各种文件整理场景,显著提升工作效率。