第05篇已经得到能生成CSV的文件清单脚本。接下来先不增加扫描能力,练习一件更基础的事:看清它准备改哪里,保留改前副本,再确认恢复真的有效。
本篇只把成功提示从“已生成”改成“清单已生成”,CSV格式与输入保持原样。这种小改动很适合第一次练习差异审阅:你能明确指出哪一行变了,也能检查是否夹带了别的修改。
前置条件与完成目标
沿用第05篇的 file_list.py 与三份合成文本。已有可运行的Python 3.10或更高版本;本例实际使用Windows上的PowerShell 7与Python 3.10.6,不安装新依赖。若当前终端缺少 Get-FileHash,先说明环境差异,不把复制成功当作完整验证通过。
本篇成果是一个改前副本、一份差异、修改后的实际运行结果,以及恢复后的核对结果。操作只涉及练习目录内指定文件,不删除输入。
资料核对日期:2026年11月5日。官方文档说明,应用的审查面板要求项目位于Git仓库中;/review可以给出审查发现,但审查发现不等于程序测试结果。官方代码审查说明
如果当前练习没有Git仓库,本篇仍可完成:让Codex比较两个实际文件。这里实际验证的是文件副本、文字差异和运行结果,没有声称实测了各客户端的审查界面。Git分支与提交留在后续课程。
1. 先建立一个不会悄悄覆盖的恢复点
先让Codex确认实际练习目录,再提出这个请求:
确认当前目录是本系列的练习项目,读取 file_list.py。
把原脚本复制到 restore-point/file_list.py,记录原脚本SHA-256。
如果 restore-point 已存在,停止并说明,不覆盖旧恢复点。
现在只建副本,不修改脚本、不改输入、不安装依赖。
下面是本例实际执行的PowerShell命令。执行前确认当前目录与脚本位置;同名恢复目录存在时第一条检查会停止,不要为继续教程而删除自己的旧副本。
$ErrorActionPreference = 'Stop'
if (Test-Path -LiteralPath '.\restore-point') { throw 'Restore point already exists' }
New-Item -ItemType Directory -Path '.\restore-point' | Out-Null
Copy-Item -LiteralPath '.\file_list.py' -Destination '.\restore-point\file_list.py'
(Get-FileHash -LiteralPath '.\file_list.py' -Algorithm SHA256).Hash
副本位置应在项目内、input/之外,避免把它当成新的输入。这个恢复点只有脚本,不包含输入、输出、依赖和其他文件;不能把它当成完整项目备份。
2. 把修改范围压到一行
恢复点确认后,再发出修改请求:
只修改 file_list.py 最后一行的成功提示:把“已生成”改成“清单已生成”。
不要改变CSV路径、表头、排序、扫描范围或失败退出码;不修改输入和恢复副本。
修改后与 restore-point/file_list.py 比较,输出统一差异,解释每处变化。
暂不恢复文件,也不要把“已改代码”当成“已验证”。
本例实际差异的关键两行如下。这里的减号和加号是差异标记,不是要加到Python代码里的字符。
- print(f"已生成 output/file-list.csv,共 {count} 条数据")
+ print(f"清单已生成 output/file-list.csv,共 {count} 条数据")
读差异时先问三件事:改的是预期文件吗?删除行与增加行是否只体现约定的提示语变化?是否还出现了扫描逻辑、输出目录或额外文件的修改?
如果看到大量不相干的改动,先停下来确认原因。不要因为其中有想要的那一行,就直接接受整个改动。
3. 运行验证:终端输出与CSV分别看
在确认过的练习目录运行:
python -I -B -X utf8 file_list.py
本例修改版实际退出码为0,终端显示:
清单已生成 output/file-list.csv,共 3 条数据
这只证明这次运行走到了成功路径。还要打开 output/file-list.csv,确认仍是 relative_path,size_bytes 两列、三条数据;本例进一步逐字节比较了改前改后的CSV,结果完全一致。
第05篇的重复运行会重写这份生成CSV,本篇没有改变这一行为。不要把终端提示语等同于文件内容,也不要拿截图代替实际CSV核对。
4. 恢复前先看当前脚本,恢复后再运行
先确认此时脚本仍只有本次提示语变化,没有其他人或其他任务的新修改。恢复会覆盖当前的 file_list.py;如果中间又增加了别的功能,应先另存当前版本并核对,而不是直接覆盖。
在本轮已确认只有一行变化的练习中,实际运行了:
Copy-Item -LiteralPath '.\restore-point\file_list.py' -Destination '.\file_list.py'
(Get-FileHash -LiteralPath '.\file_list.py' -Algorithm SHA256).Hash
恢复后脚本的SHA-256应与建副本时记录的原值一致。你自己保存文件时可能使用不同换行,应比较自己本轮的前后值,不必强行匹配别人的哈希。
再运行一次脚本。本例提示回到“已生成”,退出码0,CSV与初始基线逐字节一致,三份输入也未变化。
实际验收与常见错误
| 检查 | 本例实际结果 |
|---|---|
| 恢复副本 | 与原脚本逐字节一致 |
| 重复创建同名恢复点 | 明确失败,原副本未被覆盖 |
| 查看统一差异 | 只删除一行、增加一行,内容是提示语变化 |
| 运行修改版 | 退出0,提示语改变,CSV不变 |
| 恢复脚本 | SHA-256回到原值 |
| 运行恢复版 | 输出与CSV回到基线,退出0 |
| 输入前后比较 | 原三份文本与本轮副本SHA-256不变 |
以上7项均已实际核对。本例没有验证并发编辑、复杂文件权限、链接、硬件损坏或完整项目恢复;同目录副本也不能防止整块磁盘丢失。
常见错误是改完再把新代码存成“改前副本”、恢复前不看当前文件、只看成功文字不打开CSV。遇到这些情况,先厘清哪个版本在什么时间保存,不能靠文件名猜测。
本篇完成标准是:你能解释差异中每个改动,找到真实改前副本,并用哈希与运行结果证明恢复。下一篇在这份已核对的脚本上增加指定后缀筛选,同时保住默认行为。
示例已编写并验证。创作说明:AI 辅助创作。