编程与 AI12 分钟阅读更新于 2026-07-15

Python 怎么批量重命名文件:照片、文档、素材整理都能用

讲清 Python 批量重命名文件的安全流程,包括预览改名结果、按序号补零、保留扩展名、处理重复文件名和避免误覆盖。

相关工具

批量重命名前先做预览

批量重命名是很实用的 Python 任务,但也很容易出事。照片、截图、合同、素材、导出文件一旦改错名字,后续查找会很麻烦。如果脚本覆盖了已有文件,甚至可能造成数据丢失。所以第一原则是:先预览,不直接改。

预览的意思是先打印旧文件名和新文件名,人工确认规则没有问题,再执行 rename。比如你想把素材文件统一改成 material_001.png、material_002.png,可以先列出计划:

python代码示例
from pathlib import Path

folder = Path('images')
files = sorted(folder.glob('*.png'))

for index, path in enumerate(files, start=1):
    new_name = f'material_{index:03d}{path.suffix.lower()}'
    print(path.name, '->', new_name)

这里的 `{index:03d}` 表示序号补齐三位,1 会变成 001。补零的好处是文件排序更稳定。否则 10 可能排在 2 前面,整理素材时很烦。

真正改名前检查目标文件是否存在

确认预览没问题后,再执行重命名。执行前要检查目标文件是否已经存在,避免覆盖:

python代码示例
from pathlib import Path

folder = Path('images')
files = sorted(folder.glob('*.png'))

for index, path in enumerate(files, start=1):
    target = folder / f'material_{index:03d}{path.suffix.lower()}'
    if target.exists() and target != path:
        print('跳过,目标已存在:', target.name)
        continue
    path.rename(target)

这个脚本只处理 png 文件。如果你要处理 jpg、jpeg、webp,可以分多次处理,或者用后缀集合判断。不要直接对整个目录所有文件执行重命名,除非你非常确认目录里没有不该处理的文件。

如果文件名里有中文、空格或特殊符号,pathlib 通常能正常处理。不要手动拼接反斜杠路径,Windows 和其他系统的路径写法不同,pathlib 会更稳。

按原文件名提取信息再重命名

有些时候不是简单编号,而是要从原文件名里提取日期、编号或标题。比如原文件名是 IMG_20260715_093000.jpg,你想改成 20260715_001.jpg,可以用正则提取日期:

python代码示例
import re
from pathlib import Path

folder = Path('photos')
for path in sorted(folder.glob('*.jpg')):
    match = re.search(r'(\d{8})', path.stem)
    if not match:
        print('未找到日期,跳过:', path.name)
        continue
    date = match.group(1)
    print(path.name, '包含日期', date)

提取规则确认后,再组合新名称。复杂重命名建议分两步:第一步生成对照表,第二步执行。对照表可以是 CSV,里面写旧文件名和新文件名。这样即使改名后发现问题,也能根据对照表追溯。

如果你要把中文标题转成 URL 友好的英文或拼音,可以先用站内拼音工具或 URL slug 工具整理规则,再放进脚本。文件名最好少用特殊符号,避免上传到系统或网页时出现兼容问题。

处理重复名称和大小写问题

重复名称是批量重命名的常见坑。比如两个文件都要改成 report.pdf,后一个就会和前一个冲突。比较稳的做法是在生成目标名时加入序号,或者发现重复时自动追加后缀:

python代码示例
def unique_path(path):
    if not path.exists():
        return path
    stem = path.stem
    suffix = path.suffix
    parent = path.parent
    counter = 2
    while True:
        candidate = parent / f'{stem}_{counter}{suffix}'
        if not candidate.exists():
            return candidate
        counter += 1

大小写也要注意。某些系统区分大小写,某些系统不区分。把 A.png 改成 a.png,在 Windows 上可能表现和你预期不同。遇到只改大小写的情况,可以先改成临时名,再改成目标名,但这种操作更要谨慎。

批量改名最好不要跨目录移动和改名同时做。先在同一目录内把名字规则整理好,再决定是否移动到新目录。一次脚本做太多事,出了问题更难排查。

保留一份改名前后的记录

实际工作里,批量重命名最好输出一份日志。比如 old_name,new_name,status。这样以后有人问某个文件原来叫什么,你能查到。示例:

python代码示例
import csv
from pathlib import Path

records = []
folder = Path('images')
for index, path in enumerate(sorted(folder.glob('*.png')), start=1):
    target = folder / f'material_{index:03d}{path.suffix.lower()}'
    records.append({'old_name': path.name, 'new_name': target.name})

with open('rename_log.csv', 'w', encoding='utf-8-sig', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=['old_name', 'new_name'])
    writer.writeheader()
    writer.writerows(records)

有了日志,你可以先检查 CSV,再执行改名;也可以执行改名后保留记录。对照片、合同、素材库这类文件,日志很有用。不要觉得只是改名小事,批量操作一多,人工记忆完全靠不住。

最后再强调一次:批量脚本要先在测试目录跑。复制几份样本文件,确认预览、日志、重命名都符合预期,再处理正式文件。Python 能省很多时间,但安全习惯要先建立。

常见问题

批量重命名会覆盖文件吗?

如果不检查目标文件,可能覆盖或报错。脚本里应该先判断 target.exists(),发现冲突就跳过或生成唯一名称。

为什么序号要补零?

补零后排序更稳定,比如 001、002、010 会按预期排列,不容易出现 10 排在 2 前面的情况。

可以直接处理正式目录吗?

不建议。先复制少量样本到测试目录,确认规则正确后再处理正式文件。

Python 实用

继续阅读

返回专题