零代码应用开发·第 10 章·3 学时

批量干活

先预演,后执行,留记录。三百个文件的改名与还原都在一分钟内完成。

本章精髓 循环让同一段代码作用于一千个对象,这是程序真正比人强的地方,也是它真正比人危险的地方。手工改名改错影响一两个文件,脚本改错影响全部文件,而且没有撤销键。所以本章的规矩是:先预演,后执行,留记录。

学完本章后,你应该能够:

  1. 指出一段代码里重复执行的是哪几行,并说明缩进决定了什么;
  2. 在批量操作之前跑一次预演,依据打印结果判断规则对不对;
  3. 为批量改名写清三件事:筛选条件、命名规则、重名时怎么办;
  4. 依据改名记录把文件名还原到执行之前的状态;
  5. 说清预演结果为什么可能与执行结果不一致,以及执行之后还要核对什么。
配套演示文件 第10章演示_改名沙盘.html 第10章演示_预演盲区.html 第10章演示_生成测试文件夹.py 第10章演示_批量改名.py 第10章演示_回退.py

动手之前,先把三道防线立起来

成品 · 三道防线 · 先要预演版

这是本课程里第一个会真正改动硬盘内容的程序。

1.1本章成品:批量重命名工具

成品是一个 Python 脚本。运行后,它把指定文件夹里的图片按统一规则重命名,其余类型的文件一律跳过;改名的同时写下一份新旧名称的对照记录,据此可以把名称还原。

命令提示符 · 预演结果
…\第10章> python 第10章演示_批量改名.py DSC01.JPG → 课堂照片_001.jpg IMG_2001.jpg → 课堂照片_002-2.jpg IMG_2002.jpg → 课堂照片_003.jpg (中间省略十余行) 屏幕截图 2026-03-15.png → 课堂照片_022.png 跳过 说明.txt 跳过 课表.xlsx 以上为预演结果,共 24 个文件待处理。

这一次运行没有改动任何文件,箭头表示"将要改成"

第二行的 课堂照片_002-2.jpg 是重名处理的结果:目标名称已经被文件夹里原有的某个文件占用,所以序号后面追加了 -2。这类情况在批量改名里很常见,规则必须事先规定好,否则脚本要么中断,要么把别人覆盖掉。

1.2执行之前的三道防线

一条命令可以在一秒内改掉三百个文件的名称,同样也可以在一秒内把它们弄乱,而且没有撤销键。本章的所有操作都建立在三道防线之上。

第一道
在测试文件夹里练习
配套的生成脚本随时能建一个含三十个文件的练习环境,重复运行即可重置。
拿毕业论文的素材文件夹试手
第二道
先跑预演版本
预演只打印将要发生的结果,不做任何改动。核对通过才继续。
第一次运行就是正式执行
第三道
执行时写下改名记录
记录是一份新旧名称的对照表,回退脚本据此把名称改回原样。
改完才想起来要留记录
记录必须在执行过程中写入,事后无法补写。因为等你想起来的时候,原名称已经不存在了。这一条不是流程建议,是物理事实。

抛开处理的是图片、文档还是表格,批量操作的结构都一样:

第一步
取得清单
列出待处理的全部对象并排序
第二步
逐个判断
符合条件的处理,其余跳过
第三步
逐个处理
执行改动并记录下来

本章的代码就是这三步,其余部分都是围绕它们的保护措施

讨论手工改名出错时通常只影响一两个文件,批量脚本出错时会影响全部文件。这一差别应当怎样反映到你的操作习惯上?换句话说,哪些步骤在手工作业里可以省,到了批量作业里就不能省?

1.3本章新技巧:要求先出预演版

提出"批量重命名"这个需求,大模型默认给你的是一份可以直接改动文件的完整脚本。拿到手直接运行,第一次运行就是正式执行,检查的机会已经错过了。

所以本章的提问分两步:第一步只要预演版本,核对打印结果;第二步再要求补上执行部分。两步之间隔着一次人工核对,这次核对是整个流程里唯一不能省的环节。

批量脚本的价值在于它执行得快,风险也在于它执行得快。预演把"快"这一项暂时关掉,换来一次检查的机会。

1.4可直接复制的提示词

发给 AI第一步 · 只要预演版本
写一个 Python 脚本,对指定文件夹里的图片批量重命名,在 Windows 的终端里运行。 【先只给预演版本】逐行打印"原文件名 → 将要改成的新文件名", 不要对任何文件做实际改动。我核对无误之后,再让你补上执行部分。 规则: ① 只处理 .jpg 和 .png,其余文件打印"跳过"并略过; ② 比较扩展名之前先统一转成小写,让 .JPG 也能被识别; ③ 新名称格式为 前缀_三位序号,例如 课堂照片_001.jpg,扩展名沿用原文件并转小写; ④ 目标名称已被占用时,在序号后面追加 -2; ⑤ 处理之前先把文件列表排序,让每次运行的顺序一致; ⑥ 文件夹按脚本自身所在的位置去找,不要写成绝对路径。 文件夹名、名称前缀、是否预演三项写在代码最上方的设置区,用中文注释标明。 每一段代码前加一行中文注释。只用 Python 标准库。
发给 AI第二步 · 核对之后再补执行部分
预演结果我已经核对无误。请在原脚本的基础上补上执行部分,要求: 【不要改动】设置区,以及打印"原名 → 新名"的那几行,保持原样。 预演开关为 False 时才真正改名;为 True 时的行为与现在完全一致。 真正执行时,把每一次改动按"新名称 <- 原名称"的格式写入同目录下的 改名记录.txt, 写文件时指定 encoding='utf-8'。 执行结束后打印一共处理了多少个文件。 只给出需要新增或修改的那几行,不要重写整个脚本。
发给 AI第三步 · 回退脚本
再写一个独立的 Python 脚本,用来把上一步的改名还原。 读取同目录下的 改名记录.txt,每行格式为"新名称 <- 原名称",按记录把文件名改回原样。 记录文件不存在时,打印一句中文提示后正常结束,不要抛出报错。 记录里的某个文件已经不在文件夹里时,打印"找不到 某某,跳过",继续处理下一行。 同样先给预演版本:只打印将要还原的对照,不做实际改动。 只用 Python 标准库,每一段代码前加一行中文注释。

第一段里的六条规则,每一条都对应后面要讲的一个知识点:

先只给预演版本,不要做实际改动
知识点 05:执行之后没有撤销机会,预演是唯一的检查环节
只处理 .jpg 和 .png,其余打印"跳过"
知识点 03:筛选条件不写明,文件夹里的其他文件也会被改名
比较扩展名之前先统一转小写
知识点 03:不转小写时,.JPG 会被当成不符合条件而漏掉
新名称格式为 前缀_三位序号
知识点 06:不补零时,按名称排序的结果与数字顺序对不上
目标名称已被占用时追加 -2
知识点 07:不作规定时,脚本或者中断,或者覆盖同名文件
文件夹按脚本自身所在的位置去找
知识点 04:绝对路径里有盘符和用户名,换一台机器就失效

1.5大模型的常见偏差

直接给出会实际改动文件的版本。 这是它的默认行为,因为需求本身就是"批量重命名"。要求里必须出现"先只给预演版本""不要对任何文件做实际改动"这两句,缺一句都可能拿到完整功能的脚本。

不处理重名冲突。 多个文件算出同一个名称时,脚本要么中断,要么覆盖。前者只是白跑一趟,后者会造成文件丢失,而且屏幕上不会有任何提示。冲突规则必须写进需求。

不写改名记录。 它默认改名是一次性动作,不会主动考虑还原。记录只能在执行过程中写入,一旦执行完成,原名称已经不存在,事后补写无从谈起。

把路径写成绝对路径。 它会自行假定一个路径写进代码,例如 C:\Users\User\Desktop\photos。这份脚本在你的机器上就跑不起来,更不用说发给同组同学。

备用方案 现场生成不顺时,直接用 第10章演示_批量改名.py第10章演示_回退.py,两者的设置区结构与提示词得到的结果一致。完全没装 Python 的机器,可以先打开 第10章演示_改名沙盘.html,把设置区的每一项开关一次,看规则怎样改变结果。三个演示文件都不依赖网络。

循环、筛选与命名规则 本章重点

循环 · 排序 · 条件筛选 · 路径 · 补零

本章的核心内容集中在这一部分和下一部分。

本章要学的术语 · 八个
01循环loop / for
02列表与排序list / sorted
03条件筛选if / continue
04文件路径path
05序号补零zero padding
06预演dry run
07重名冲突name collision
08操作记录与回退log / rollback

这八个术语会原样出现在脚本参数、技术文档与运维规范里。前五个在本部分讲解,后三个在第三部分讲解。

2.1五个知识点,一个一个看

01循环:一段代码作用于一批对象
DSC01.JPG
IMG_2001.jpg
海报终稿.png
同一段代码
对清单里的每一项
执行一次

代码只写一遍,执行次数由清单的长度决定

现象:代码里缩进的那几行只写了一遍,运行之后却对三十个文件都起了作用。

概念:循环(loop)指对一批对象重复执行同一段代码。for old in files: 的意思是:把 files 里的每一项依次取出,叫它 old,然后执行下面缩进的语句。缩进决定了哪些语句属于循环体,缩进错一格,执行次数就变了。

类比:流水线上每个零件都要经过同一道工序,工序只需要设置一次。

02列表与排序:先取清单,再逐个处理
文件夹 30 个条目,顺序不确定两次运行序号可能不同
清单 先列出来再排序每次运行顺序一致

排序之后,序号的分配才是可预测的

现象:代码先用一行把文件列出来,之后才进入循环。

概念:批量处理的第一步是取得一份列表(list),也就是把待处理的对象一次性列出来。先取清单再处理,可以避免在遍历过程中因为文件被改名而漏掉或者重复处理。sorted 让处理顺序固定,同一批文件每次运行得到同样的结果。

类比:仓库发货前先打一份出货单,再照单取货,而不是一边找一边取。

03条件筛选:只对符合条件的对象动手
海报终稿.png改名
说明.txt跳过
DSC01.JPG改名

大写的 .JPG 也要能被认出来,比较前统一转小写

现象:文件夹里的 .txt 文件在屏幕上显示"跳过",名称没有变化。

概念:条件筛选(if)用来只对满足条件的对象执行操作,本例的条件是扩展名属于 .jpg 或 .png。continue 表示跳过本次循环剩下的语句,直接处理下一项。筛选条件写得越明确,误改的可能性越小。

类比:分拣时只收带地址标签的包裹,广告传单一律不收。

04文件路径:程序到哪里去找这批文件
绝对路径 C:\Users\liwei\Desktop\照片换台机器就失效
脚本位置 本文件旁边的 测试文件夹随脚本一起移动

写死盘符与用户名的路径,只在写它的那台机器上成立

现象:同一份脚本在同组同学的机器上提示找不到文件夹。

概念:文件路径(path)是文件在硬盘上的位置。绝对路径从盘符写起,里面带着用户名,换一台机器就不成立。本例改用脚本自身所在的位置作基准,文件夹跟着脚本一起走。路径里的空格与中文本身不会出错,出错的通常是把路径拆开拼接时漏了分隔符。

类比:写完整地址,和写"本楼三层",是两种定位方式。后者只在你确实站在这栋楼里时才成立。

05序号补零:让名称排序与数字顺序一致
未补零
照片_1.jpg
照片_10.jpg
照片_11.jpg
照片_2.jpg
照片_3.jpg
10、11 排到了 2 前面
补足三位
照片_001.jpg
照片_002.jpg
照片_003.jpg
照片_010.jpg
照片_011.jpg
顺序与数字一致

两列都是按名称排序的真实结果

现象:改名之后按名称排列,第 10 张照片排到了第 2 张前面。

概念:文件名按字符逐位比较,第一位的 1 小于 2,所以 10 排在 2 前面。把序号补足固定位数叫补零(zero padding),补零之后名称排序与数字顺序一致。str(number).zfill(3) 表示不足三位时在左边补零。位数要按总量预留,超过一千个文件就该补足四位。

类比:门牌号写成 001、002,与写成 1、2,在按名称排列时会得到不同的顺序。

本章方法 任何批量操作,第一遍只打印不动手。核对通过之后,再执行第二遍。

2.2本章的完整代码

下面这份代码由大模型生成。设置区的三项集中在最上方,其余部分对应上面的知识点。

第10章演示_批量改名.py正文 · 可直接运行
from pathlib import Path

# ===== 设置区:只需要改下面三项 =====
FOLDER  = '测试文件夹'   # 待处理的文件夹,与本文件放在同一位置
PREFIX  = '课堂照片'     # 新文件名的前缀
DRY_RUN = True           # True 为预演,只打印不改动;False 为真正执行
# ==================================

folder = Path(__file__).with_name(FOLDER)

# ① 先取清单:一次性列出文件夹里的文件并排序,再逐个处理
files = sorted(p for p in folder.iterdir() if p.is_file())

records = []
number = 0

# ② 循环:对清单里的每一个文件重复同样的处理
for old in files:

    # ③ 条件筛选:只处理图片,其余文件跳过
    if old.suffix.lower() not in ['.jpg', '.png']:
        print('跳过', old.name)
        continue

    # ④ 组成新名称:序号补足三位,扩展名沿用原文件并转小写
    number = number + 1
    new = folder / (PREFIX + '_' + str(number).zfill(3) + old.suffix.lower())

    # ⑤ 重名处理:目标名称已被占用时,在末尾追加 -2
    if new.exists() and new != old:
        new = folder / (new.stem + '-2' + new.suffix)

    print(old.name, '→', new.name)
    records.append(new.name + ' <- ' + old.name)

    # ⑥ 预演状态下到此为止,不做任何实际改动
    if not DRY_RUN:
        old.rename(new)

# ⑦ 真正执行后写入改名记录,作为回退依据
if not DRY_RUN:
    log = Path(__file__).with_name('改名记录.txt')
    log.write_text('\n'.join(records), encoding='utf-8')
    print('已处理', len(records), '个文件,改名记录已写入', log.name)

input('按回车键结束')

按本章方法核对:输入是设置区的三项加上文件夹里的清单,输出是屏幕上的每一行打印和最后写入的改名记录,重复执行的部分是 ② 之下缩进的全部语句,执行次数等于清单的长度。

下面这张表的第三列是反例:把这一行改掉或者删掉,会发生什么。

sorted(p for p in folder.iterdir() …)
列出文件并排序。is_file() 让子文件夹不被计入。 不排序时,处理顺序由系统决定,同一批文件两次运行可能得到不同的序号
old.suffix.lower() not in […]
按扩展名筛选。先转小写再比较,所以 .JPG 与 .jpg 都能被认出来。 不转小写时,大写扩展名的文件会被当成不符合条件而跳过
str(number).zfill(3)
把序号补足三位。1 变成 001,10 变成 010。 不补零时,按名称排序的结果与数字顺序对不上
new.exists() and new != old
重名判断。后半句排除了"目标名称就是它自己"的情况,免得文件被无谓地加上 -2。 缺这个判断时,Windows 上中断,其他系统上原有的同名文件被覆盖
if not DRY_RUN: old.rename(new)
整个脚本里唯一改动硬盘的一行。预演与执行的全部差别就在这里。 把这一行提到 if 外面,预演就失去意义
log.write_text(…, encoding='utf-8')
写入改名记录。指定 utf-8 之后,中文名称在记录里不会变成乱码。 不写记录时,执行之后只能逐个手工改回去

预演、重名与回退 本章重点

dry run · 重名冲突 · 操作记录 · 预演的盲区

这一部分讲的全是保护措施,也是本章真正要带走的东西。

3.1另外三个知识点

06预演:执行之前唯一的检查机会
DRY_RUN = True打印将要改成什么
同一份代码不改动任何文件
DRY_RUN = False真的改,没有撤销键

改一项设置,同一份代码就在两种行为之间切换

现象:第一次运行只在屏幕上打印了"原名 → 新名",文件夹里什么都没变。

概念:预演(dry run)指先把全部判断与计算跑完,但不做任何实际改动,把将要发生的结果打印出来给人核对。批量操作一经执行就作用于全部对象,预演是执行之前唯一的检查环节。专业工具普遍提供这一功能,参数名通常就叫 dry-run。

类比:裁布之前先用粉笔画线,确认无误再下剪刀。

07重名冲突:两个文件算出了同一个名称
不作处理 目标名称已被占用中断,或者覆盖
追加 -2 换一个没被占用的名字两个文件都保住

覆盖是不可见的,屏幕上不会有任何提示

现象:预演结果里出现了 课堂照片_002-2.jpg 这样带后缀的名称。

概念:目标名称已经被占用的情况叫重名冲突。Python 的 rename 在 Windows 上遇到重名会抛出 FileExistsError 并中断,在部分系统上则直接覆盖同名文件,被覆盖的那个文件随即消失。凡是自动生成名称的脚本,都必须事先规定冲突时怎么办,例如在末尾追加 -2、-3。

类比:两名同学重名时,点名册上要加学号区分,否则不知道叫的是谁。

08操作记录与回退:把名称改回原样的依据
改名记录.txt共 24 行
课堂照片_001.jpg <- DSC01.JPG 课堂照片_002-2.jpg <- IMG_2001.jpg 课堂照片_003.jpg <- IMG_2002.jpg ……

每行一次改动,回退脚本按这份记录逐条还原

现象:执行之后,脚本旁边多出一个 改名记录.txt。

概念:操作记录(log)是新旧名称的对照表,每行记录一次改动。批量改名之后没法凭记忆还原,有记录才能回退(rollback)。记录必须在执行过程中写入,事后无法补写,因为那时原名称已经不存在了。

类比:调整仓库货位之前先拍一张原位置的照片,摆错了还能照原样放回。

3.2预演与执行的差别

两次运行用的是同一份代码,差别只有设置区的一项。第一次运行之后文件夹没有任何变化,第二次运行之后文件名全部更新,并且多出一个改名记录。

预演DRY_RUN = True
屏幕上逐行打印"原名 → 新名",末尾给出待处理的数量。

文件夹内容完全不变,也不生成改名记录。可以反复运行,直到打印结果符合预期。
执行DRY_RUN = False
屏幕输出与预演一致,同时真正改动文件名。

执行结束后生成 改名记录.txt。这一步没有撤销键,只能靠记录回退。

文件夹在执行前后的对照如下。被跳过的四个文件保持原样,这一点在核对时最容易被忽略

执行前 · 测试文件夹
DSC01.JPG
IMG_2001.jpg
屏幕截图 2026-03-15.png
海报终稿.png
执行后 · 测试文件夹
课堂照片_001.jpg
课堂照片_002-2.jpg
课堂照片_022.png
课堂照片_023.png

打开 第10章演示_改名沙盘.html,把设置区的每一项都开关一次:关掉补零看排序,关掉重名规则看覆盖,把预演开关拨到执行再点回退。这个沙盘不碰你硬盘上的任何文件,可以放心把每一种错误都犯一遍。

3.3预演的盲区

三道防线立好之后还剩一个漏洞,它是本章最值得记住的一句话。

预演结果并非永远等于执行结果。 预演是按文件夹的当前状态推算的。真正执行时,文件名会陆续变化,先改好的名称有可能占用后面某个文件的目标名称。两者在绝大多数情况下一致,但执行之后仍然要打开文件夹核对一遍,这一步不能省。

打开 第10章演示_预演盲区.html,里面是一个三个文件的最小例子,一步一步走完就能看清这件事是怎么发生的。看完之后你会明白:预演给的是一份预测,不是一份保证。

核对的顺序是固定的:先看数量,再看名称。数量对不上说明有文件消失或者被合并,这是重伤,要立刻停手;数量对得上而名称不对,多半只是规则写错了,回退重来即可。

讨论预演打印出二十四行,执行之后文件夹里却只有二十三个新名称。可能是哪一个环节出了问题?按"先看数量,再看名称"的顺序,你会先检查什么?如果这二十四个文件是别人交上来的作业,你打算怎么向他解释?

完整演示与一条行业惯例

建环境 · 预演 · 执行 · 回退

从一个空白的练习环境开始,走完改名与还原的一个完整回合。

4.1演示步骤

1
运行生成脚本,建立测试文件夹
得到三十个文件,其中图片二十四个,另有 .txt、.docx 等六个用来验证筛选。重复运行会清空并重建,可以随时重置环境
产出:一个练习用的文件夹
2
用第一段提示词取得预演脚本,填写设置区
文件夹名与实际一致,前缀自定,预演开关保持 True
产出:一个只打印不改动的脚本
3
运行预演,逐项核对打印结果
核对四项:序号连不连续、扩展名有没有保留、非图片文件是不是显示"跳过"、总数与图片数量对不对得上。有一项不符就回到提示词改规则,不要直接执行
产出:一份核对通过的预演输出
4
把预演开关改为 False,执行一次,打开文件夹核对
执行之后不要只看屏幕输出,要打开文件夹数一遍文件数量,确认没有减少
产出:改名后的文件夹与改名记录
5
运行回退脚本,把名称还原
同样先预演再执行。还原之后对照第 1 步的文件列表,确认与执行前一致
产出:还原成功的验证
6
制造一次重名冲突,观察处理结果
把某个文件手工改名为脚本将要生成的名称,例如 课堂照片_005.jpg,再执行一次,看序号后面有没有出现 -2
产出:冲突规则生效的实例
7
只改设置区的前缀,重新预演
前缀换成另一个词,代码其余部分一个字不动,重新预演。这一步用来说明:设置区与处理逻辑分开之后,换一批文件、换一套命名只要改三行
产出:设置区作用的验证

4.2执行之后要核对什么

屏幕上的输出只能证明脚本自认为做了什么,证明不了硬盘上真的发生了什么。执行之后打开文件夹,按这个顺序看三样:

文件数量 执行前后应当完全相同 少了就是被覆盖,立刻停手,用改名记录还原
被跳过的那几个 名称应当一个字都没变 变了说明筛选条件写错,误伤了不该动的文件
改名记录的行数 应当等于屏幕上打印的处理数量 对不上说明中途出过错,记录不完整,回退会不彻底
执行后文件数量减少,只有一种解释:重名时被覆盖,被覆盖的文件已经消失。这时唯一正确的动作是立刻停止一切操作,先用改名记录还原,再去查冲突规则。继续跑一遍试试看,只会把记录也弄乱。

4.3前沿三分钟:可撤销与不可撤销的操作

每章固定栏目 · 一条与本章内容相关的行业动态

预演不是给初学者准备的辅助功能。文件同步工具 rsync、容器编排工具 kubectl、多数系统的软件包管理器,都提供 dry-run 参数,作用与本章设置区的那一项完全相同:把全部判断跑一遍,把将要发生的结果打印出来,不做任何改动。用这些工具的都是熟练的运维人员,他们在正式执行之前同样要先跑一次预演。

与之相关的还有另一条线索:回收站、撤销栈、版本控制系统,这些机制的出发点是同一个判断,即操作者一定会出错,系统应当保留改正的机会。判断一项功能设计得好不好,可以看它在出错之后留给使用者多少余地。

本章的三道防线是这套惯例的最小实现:测试文件夹对应隔离环境,预演对应 dry-run,改名记录对应撤销栈。三者都不复杂,缺任何一项都会在某一次操作里付出代价。

讨论如果一项操作既无法预演也无法撤销,可以用什么办法降低风险?先备份是不是总能解决问题?在文件数量很大、或者操作对象不是文件而是数据库记录时,备份的代价会有什么变化?

上机实验

三选一 · 六步 · 预演与回退

上机环节由此开始,当堂完成并提交。

5.1三个题目,任选其一

题目 A
作业批量改名

把一批作业文件按"学号_姓名_作业名"的规则统一重命名。

通用
题目 B
文档批量筛选

读一批 txt 的内容,给含有指定关键词的文件在名称前统一加上标记。

偏文科
题目 C
文件按日期归档

读文件的修改时间,按年月建立子文件夹并把文件移进去。

偏理工

三个题目都必须具备预演版本、重名处理规则、操作记录三项,验收标准一致。允许更换题材。练习一律在测试文件夹里进行,不得使用真实资料。

5.2上机六步

1
运行生成脚本,建立测试文件夹
题目 B 与 C 要自己调整生成脚本里的文件名列表,让它包含本题需要的内容。确认文件数量不少于二十个
产出:练习环境
2
用第一段提示词取得预演脚本,填写设置区
把本题的筛选条件与命名规则写进提示词,不要留下"注意处理好边界"这类没有具体内容的说法
产出:预演脚本
3
运行预演,逐项核对并截图
核对序号、扩展名、跳过的文件、总数四项。核对不通过时回第 2 步改规则,不要跳过这一步直接执行
产出:预演输出截图
4
用第二段提示词补上执行部分,执行一次
执行前后各截一张文件夹的图。执行之后数一遍文件数量,确认没有减少
产出:改名前后截图与改名记录
5
用第三段提示词取得回退脚本,把名称还原
还原之后与第 4 步的改前截图逐条比对,确认完全一致。不能还原的作品不算完成
产出:还原后的截图
6
组内互测:把三个脚本发给同组同学,在他的机器上完整走一遍
对方用自己生成的测试文件夹。重点看两件事:脚本有没有把路径写死,预演开关是不是真的起作用
产出:一行互测记录

5.3共同验收标准

预演版本不改动任何文件 只打印,不动手 运行预演前后各看一次文件夹,内容应当完全相同
筛选条件生效 不符合条件的文件被跳过且名称未变 看打印结果里有没有"跳过",再核对这些文件的名称
序号补足位数 001 而不是 1 按名称排序,确认顺序与数字顺序一致
重名冲突有明确的处理规则 既不中断,也不覆盖 手工制造一次重名后重新执行,看结果
执行前后文件数量不变 改名不应当让文件消失 执行前后各数一遍文件夹里的文件数量
操作记录完整 每一次改动一行,中文不乱码 记录的行数与打印的处理数量一致
能够完整回退 还原后与执行前完全一致 用执行前的截图逐条比对还原后的文件名

5.4常见错误与处理

FileNotFoundError,找不到测试文件夹
设置区的文件夹名与实际不符,或者文件夹不在脚本旁边
核对名称有没有多余空格,并把文件夹与脚本放在同一位置
预演输出为空,一个文件都没有
筛选条件与实际扩展名不符,例如文件是 .jpeg
把 .jpeg 加进允许列表,并确认比较前已经转小写
FileExistsError,执行中途中断
目标名称已被占用,脚本没有冲突处理
先用改名记录还原已改的部分,补上冲突规则后重新执行
执行后文件数量减少
重名时被覆盖,被覆盖的文件已经消失
立刻停止操作,用改名记录还原,再检查冲突规则有没有写进代码
PermissionError,拒绝访问
文件正被其他程序占用,例如图片预览窗口没关
关掉正在查看或编辑该文件的程序,再重新运行
改名后按名称排序错乱
序号没有补零
先回退,在设置区确认序号位数后重新执行
改名记录.txt 是空的
仍然处在预演状态,并没有真正执行
把设置区的预演开关改为 False,再运行一次
改名记录里的中文是乱码
写入文件时没有指定编码
写文件时加上 encoding='utf-8',重新执行一遍

5.5提交内容

脚本文件
改名脚本与回退脚本,设置区在最上方
两个 .py 文件
预演输出截图
看得到原名与新名的对照,以及末尾的待处理数量
一张截图
文件夹三张截图
执行前、执行后、回退后各一张
三张截图并排贴进作业文档
改名记录与规则说明
改名记录的前十行,加一句话说明你的重名规则
文字与一段记录

提交方式:按教师提供的作业模板填写,文档开头注明所选题目。提交渠道见课堂通知,当堂提交。

5.6再进一步(选做)

选做一 命名规则依赖文件自身。把"前缀加序号"改成从文件自身读取,例如按修改时间命名为 20260315_001。改完之后会碰到一个新问题:同一天甚至同一分钟内修改的多个文件会算出相同的日期部分,冲突的数量比原来大得多。这时"追加 -2"就不够用了,要重新设计序号在名称里的位置。命名规则一旦依赖文件自身的属性,冲突处理规则就得跟着一起重新考虑。

选做二 让脚本会思考。把循环里的处理动作换成一次 AI 调用:读一批 txt 或者一张表的每一行,让模型给每条内容打一个标签或者写一句摘要,结果写回一个新文件。这一版的三道防线一条都不能少,而且要多加一条:先只处理前三条,看结果对不对,再放开处理全部。模型的输出不像改名那样可以逐字预测,所以抽查这一步在这里比预演更重要。

本章小结

本章五条结论

  1. 循环让同一段代码作用于一批对象。缩进决定哪些语句属于循环体,条件筛选决定哪些对象被处理。
  2. 批量操作执行之后没有撤销键。先在测试文件夹里练习,先跑预演,核对通过之后再执行。
  3. 凡是自动生成名称的脚本,都要事先规定重名时怎么办。不作规定时,脚本或者中断,或者覆盖,而覆盖不会有任何提示。
  4. 操作记录是唯一可靠的回退依据,而且只能在执行过程中写入。
  5. 预演给的是预测,不是保证。执行之后仍要开文件夹核对,先看数量,再看名称。
本章脉络