第10讲 · 批量重命名文件
批量重命名文件
学会改名语法,再把筛选、预览和冲突检查用于批量操作。
1读取并筛选目标文件
2生成并预演重命名计划
3逐条执行并核对结果
重命名单个文件
l10_single_rename.py
old_path = os.path.join(folder, "A.jpg")
new_path = os.path.join(folder, "photo_1.jpg")
print("执行前:", sorted(os.listdir(folder)))
os.rename(old_path, new_path)
print("执行后:", sorted(os.listdir(folder)))- os.rename(old_path, new_path)
- 把旧路径对应的文件移动到新路径
- old_path
- 必须指向当前存在的文件
- new_path
- 包含目标文件夹与新文件名
1第1个参数:当前已经存在的旧路径
2第2个参数:改名后使用的新路径
3副作用:目录中的文件名立即改变
读取并排序文件名
l10_sorted_list.py
names = sorted(os.listdir(folder))
print("正在读取:", folder)
print("排序后:", names)- os.listdir(folder)
- 读取folder直接包含的名称
- sorted(os.listdir(folder))
- 固定批量处理的先后顺序
1listdir参数:要读取的文件夹路径
2listdir返回:文件夹中的名称列表
3sorted返回:按名称排列的新列表
筛选目标图片文件
l10_filter_files.py
for name in sorted(os.listdir(folder)):
old_path = os.path.join(folder, name)
if name.endswith(".jpg") and os.path.isfile(old_path):
print("目标文件:", name)- name.endswith(".jpg")
- 名称以小写.jpg结尾时返回True
- os.path.isfile(old_path)
- 路径对应普通文件时返回True
- 条件1 and 条件2
- 两个判断都为True才选中
1endswith检查名称是否以指定文字结尾
2isfile检查路径是否对应普通文件
3两个条件同时成立才进入重命名计划
生成连续文件名
l10_numbered_names.py
count = 1
for name in sorted(os.listdir(folder)):
if name.endswith(".jpg"):
new_name = "photo_" + str(count) + ".jpg"
print(name, "->", new_name)
count += 1- count = 1
- 设置第一个编号
- "photo_" + str(count) + ".jpg"
- 生成新的文件名
- count += 1
- 准备下一个编号
1count从1开始
2str(count)把数字转换为字符串
3只在命中目标文件后增加count
生成重命名计划
l10_preview_plan.py
plan.append((old_path, new_path))
for old_path, new_path in plan:
print(os.path.basename(old_path), "->", os.path.basename(new_path))- plan.append((old_path, new_path))
- 把一组路径作为元组加入列表
- for old_path, new_path in plan:
- 逐项读取计划中的两个路径
1每个计划项保存一组old_path和new_path
2先收集全部映射,再统一检查
3生成计划不会修改文件
检查目标文件名冲突
l10_conflict_stop.py
for old_path, new_path in plan:
if new_path in seen or os.path.exists(new_path):
conflict = new_path
break
seen.add(new_path)- os.path.exists(new_path)
- 检查目标位置是否已经被占用
- new_path in seen
- 检查计划内部是否重复
- if conflict: return
- 在第一条rename之前停止
1已有目标文件不能被忽略
2计划内部也不能出现重复目标
3发现任何冲突,整批保持原状
预演重命名计划
l10_dry_run_preview.py
print("预览前:", sorted(os.listdir(folder)))
apply_plan([(old_path, new_path)])
print("预览后:", sorted(os.listdir(folder)))- def apply_plan(plan, dry_run=True):
- 默认启用预演模式
- if dry_run is not False: return
- 没有明确许可就返回
- apply_plan(plan, dry_run=False)
- 明确执行计划
1默认值True表示只显示计划
2预览阶段不调用rename
3明确传入False才进入执行循环
逐条执行批量重命名
l10_step_by_step.py
print("执行前:", sorted(os.listdir(folder)))
for index, (old_path, new_path) in enumerate(plan, 1):
os.rename(old_path, new_path)
print("第" + str(index) + "条后:", sorted(os.listdir(folder)))- for old_path, new_path in plan:
- 按计划顺序取出每组路径
- os.rename(old_path, new_path)
- 每循环一次,立即产生一次文件状态变化
完成图片批量重命名
l10_safe_batch_rename.py
plan = build_plan(folder)
print("执行前:", sorted(os.listdir(folder)))
apply_plan(plan, folder)
apply_plan(plan, folder, dry_run=False)
print("执行后:", sorted(os.listdir(folder)))复盘批量重命名流程
1rename执行改名:旧路径在前,新路径在后
2join组成路径,listdir读取名称,sorted固定顺序
3endswith与isfile共同筛选目标
4先生成plan并全量查冲突,再用dry_run预演
5执行后重新读取目录,核对每一个新文件名
语法拆解
- 确认位置
- 明确当前工作目录与目标文件夹
- 计划与预检
- 完整列出旧路径、新路径和冲突
- 预演、执行、验收
- 每个阶段都核对真实目录状态
1 / 11