平时下载的剧集、照片经常带着乱七八糟的文件名,手动改名又慢又容易错。这篇用 Python 标准库写一个小脚本,几行代码批量重命名整个文件夹。

核心思路

用 os.listdir() 遍历目录,用 os.rename() 改名。下面这个例子把文件夹里所有 .mp4 改成统一格式:

import os

folder = r'D:\Downloads\course'   # 目标文件夹
prefix = 'Python课程_'

for index, filename in enumerate(os.listdir(folder), start=1):
    name, ext = os.path.splitext(filename)
    if ext.lower() != '.mp4':
        continue
    new_name = f'{prefix}{index:02d}{ext}'
    os.rename(os.path.join(folder, filename), os.path.join(folder, new_name))

运行后文件会变成 Python课程_01.mp4、Python课程_02.mp4……

进阶版:先预览,再执行

直接改名有风险,更稳妥的做法是让脚本先给出「改名计划」,确认无误再执行:

import os

def plan_rename(folder, pattern):
    """pattern 示例:'海贼王_S01E{:02d}',返回 [(旧名, 新名), ...]"""
    files = sorted(f for f in os.listdir(folder) if not f.startswith('.'))
    plan = []
    for index, filename in enumerate(files, start=1):
        ext = os.path.splitext(filename)[1]
        plan.append((filename, pattern.format(index) + ext))
    return plan

def apply_rename(folder, plan):
    for old, new in plan:
        os.rename(os.path.join(folder, old), os.path.join(folder, new))

# 第一步:生成改名计划(只看不改)
plan = plan_rename(r'D:\Downloads\anime', '海贼王_S01E{:02d}')

# 第二步:确认无误后真正执行
apply_rename(r'D:\Downloads\anime', plan)

在交互式解释器里先看看计划长什么样:

>>> plan[:2]
[('第01话.mp4', '海贼王_S01E01.mp4'), ('第02话.mp4', '海贼王_S01E02.mp4')]

更优雅的选择:pathlib

Python 3.4+ 推荐用 pathlib,路径拼接不再需要 os.path.join:

from pathlib import Path

folder = Path(r'D:\Downloads\photos')
for index, file in enumerate(folder.glob('*.jpg'), start=1):
    file.rename(folder / f'travel_{index:03d}.jpg')

几个注意点

  • 永远先备份或先预览:批量操作一旦改名错了很难恢复;
  • 新名字不要和已有文件冲突,否则会直接覆盖(Windows 下报错,Linux 下静默覆盖);
  • 需要按修改时间、大小排序改名时,用 sorted(files, key=lambda f: os.path.getmtime(os.path.join(folder, f)));
  • 只处理指定扩展名时记得 os.path.splitext() 取后缀再判断。

把这段脚本存成 rename.py,以后随时改两个参数就能用,是练手 os / pathlib 模块的好例子。