口述编程实战:5分钟从零写出批量文件重命名工具(vibe-coding第一次实操)
上章学了3个框架——RTC、EMI、SVC。
现在直接动手。
5分钟,从零口述出一个能用的工具。不是Hello World那种玩具,是一个你真的会用的小工具——批量文件重命名器。
阿Lee选这个项目是有原因的:
- 功能简单明确,5分钟真的能做完
- 实用——谁电脑里没一堆乱七八糟的文件名?
- 完整——从口述到运行,体验完整的口述编程流程
准备好了?打开Trae,我们开始。
准备工作:30秒
- 打开Trae,新建一个项目文件夹
- 随便建一个测试文件夹,里面放10个文件,名字乱一点:
plaintext
1
2
3
4
5
6
7
8
9
10
11
IMG_20260101_001.jpg
IMG_20260101_002.jpg
doc_最终版.docx
doc_最终版2.docx
doc_最终版最终版.docx
report-2025-Q4.xlsx
report-2025-Q4-副本.xlsx
screenshot_01.png
screenshot_02.png
未命名.txt
够乱吧?——这还是阿Lee故意收敛了的,真实场景更离谱。
第1轮:用RTC框架起手
在Trae的对话框里输入:
你是一个Python工具开发者,帮我写一个批量文件重命名脚本,功能:把指定文件夹里的文件按规则批量重命名。约束:1)用pathlib不用os库 2)必须先预览重命名结果,用户确认后再执行 3)加完整的错误处理 4)命令行运行
这就是RTC框架——角色(Python工具开发者)+任务(批量文件重命名脚本)+约束(4条具体要求)。
等AI生成代码。大概10-15秒。
阿Lee拿到的那一版代码大概长这样:
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from pathlib import Path
def preview_rename(folder_path, rule):
"""预览重命名结果"""
folder = Path(folder_path)
if not folder.exists():
print(f"错误:文件夹 {folder_path} 不存在")
return []
rename_pairs = []
for f in sorted(folder.iterdir()):
if f.is_file():
new_name = rule(f.name)
if new_name != f.name:
rename_pairs.append((f, f.parent / new_name))
return rename_pairs
def execute_rename(rename_pairs):
"""执行重命名"""
success = 0
for old_path, new_path in rename_pairs:
try:
old_path.rename(new_path)
success += 1
except Exception as e:
print(f"重命名失败:{old_path.name} -> {new_path.name},原因:{e}")
print(f"完成!成功重命名 {success}/{len(rename_pairs)} 个文件")
if __name__ == "__main__":
# 规则示例:把文件名中的空格替换为下划线,转小写
folder = input("请输入文件夹路径:")
rule = lambda name: name.replace(" ", "_").lower()
pairs = preview_rename(folder, rule)
if not pairs:
print("没有需要重命名的文件")
else:
print("\n预览重命名结果:")
for old, new in pairs:
print(f" {old.name} -> {new.name}")
confirm = input("\n确认执行?(y/n):")
if confirm.lower() == 'y':
execute_rename(pairs)
else:
print("已取消")
第1版代码能跑,但问题不少——
- 重命名规则太简单,只能替换空格+转小写
- 没有支持多种规则的选项
- 用户得手动输入路径,不方便
这就是RTC起手的典型结果:方向对了,细节不够。没关系,EMI框架来迭代。
第2轮:用EMI框架迭代
在第1版的对话基础上继续说:
在上面的代码基础上,做以下修改:1)加上多种重命名规则:替换指定字符串、添加前缀/后缀、序号重命名 2)让用户选择使用哪种规则 3)路径可以通过命令行参数传入
AI在第1版基础上修改,大概20秒出结果。
阿Lee拿到的第2版增加了这些:
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import argparse
from pathlib import Path
import re
def rule_replace(name, old_str, new_str):
"""规则1:替换指定字符串"""
return name.replace(old_str, new_str)
def rule_prefix(name, prefix):
"""规则2:添加前缀"""
return prefix + name
def rule_suffix(name, suffix):
"""规则3:添加后缀(在扩展名之前)"""
stem = Path(name).stem
ext = Path(name).suffix
return f"{stem}{suffix}{ext}"
def rule_number(name, number, total):
"""规则4:序号重命名"""
ext = Path(name).suffix
return f"{number:0{len(str(total))}d}{ext}"
# ... 预览和执行逻辑同第1版,加上规则选择菜单
好多了!4种规则覆盖了最常见的场景。但还有一个问题——没有撤回功能。万一改错了,文件名回不去。
第3轮:继续EMI迭代
再加一个撤回功能:执行重命名前自动保存一份映射表(旧名→新名),如果用户想撤回,读取映射表恢复原文件名
AI又加了一段:
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import json
UNDO_FILE = ".rename_undo.json"
def save_undo_map(rename_pairs):
"""保存撤回映射"""
undo_map = {str(new): str(old) for old, new in rename_pairs}
with open(UNDO_FILE, 'w', encoding='utf-8') as f:
json.dump(undo_map, f, ensure_ascii=False, indent=2)
def undo_rename():
"""撤回上次重命名"""
if not Path(UNDO_FILE).exists():
print("没有找到撤回记录")
return
with open(UNDO_FILE, 'r', encoding='utf-8') as f:
undo_map = json.load(f)
pairs = [(Path(new), Path(old)) for new, old in undo_map.items()]
execute_rename(pairs)
Path(UNDO_FILE).unlink() # 删除撤回记录
3轮下来,这个工具已经很完整了——4种重命名规则 + 预览确认 + 撤回功能。
运行效果
阿Lee用测试文件夹跑了一遍:
plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ python rename_tool.py ./test_files
请选择重命名规则:
1. 替换字符串
2. 添加前缀
3. 添加后缀
4. 序号重命名
选择:1
输入要替换的字符串:最终版
输入替换为:(留空则删除)
预览重命名结果:
doc_最终版.docx -> doc_.docx
doc_最终版2.docx -> doc_2.docx
doc_最终版最终版.docx -> doc_.docx
⚠️ 检测到重命名后可能冲突:doc_.docx
是否继续?(y/n):n
已取消
看到没?——阿Lee故意没加冲突检测,但AI在第2版里自己加了!这就是RTC框架里"角色"的威力——当你告诉AI"你是一个Python工具开发者",它会自动考虑边界情况。
换一种规则再试:
plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
选择:4
序号起始值:1
预览重命名结果:
IMG_20260101_001.jpg -> 01.jpg
IMG_20260101_002.jpg -> 02.jpg
doc_最终版.docx -> 03.docx
doc_最终版2.docx -> 04.docx
doc_最终版最终版.docx -> 05.docx
report-2025-Q4.xlsx -> 06.xlsx
report-2025-Q4-副本.xlsx -> 07.xlsx
screenshot_01.png -> 08.png
screenshot_02.png -> 09.png
未命名.txt -> 10.txt
确认执行?(y/n):y
完成!成功重命名 10/10 个文件
干净利落。10个乱七八糟的文件,3秒搞定。
复盘:5分钟里发生了什么
表格
| 步骤 | 框架 | 耗时 | 做了什么 |
|---|---|---|---|
| 第1轮 | RTC | 1分钟 | 起手,拿到基础版本 |
| 第2轮 | EMI | 1.5分钟 | 加4种规则+命令行参数 |
| 第3轮 | EMI | 1分钟 | 加撤回功能 |
| 测试 | 手动 | 1.5分钟 | 跑了2遍,验证功能 |
| 合计 | 5分钟 | 完整可用的工具 |
如果传统方式写这个工具呢?阿Lee估算——
- 写基础重命名逻辑:15分钟
- 加预览功能:10分钟
- 加多种规则:20分钟
- 加撤回功能:15分钟
- 加错误处理:10分钟
- 测试调试:20分钟
- 合计:约90分钟
5分钟 vs 90分钟,提效18倍。
这不是夸张,是口述编程的真实数据。AI帮你省掉的不是"思考"的时间,而是"编码+调试"的时间。你只需要想清楚要什么,告诉AI,它帮你写。
阿Lee的复盘心得
3轮口述做完这个小工具,有3个感受特别深:
1. RTC起手的质量决定了整个项目的效率
第1轮我给了4条约束,AI出来的代码方向基本正确。如果我只说"帮我写个重命名工具",大概率要改5轮以上。约束越具体,迭代越少。
2. 每轮只改一个核心需求
第2轮我加了4种规则+命令行参数,看起来改了两件事,但其实都是"丰富功能"这一个方向。如果你一轮里既改功能又改架构,AI容易顾此失彼。
3. 必须跑一遍再迭代
每一轮我都是先运行代码、看效果,再决定下一轮改什么。别光看AI输出的代码觉得"差不多"就继续——"差不多"和"能用"之间差着10个bug。
你刚刚完成了人生中第一次口述编程——是不是比想象中简单?
5分钟,一个小工具,从零到可用。这不是上限,是起点。
下章开始,阿Lee带你做真正的项目——用SVC框架做一个完整的Web应用。5分钟的小工具只是热身,Web应用才是口述编程真正发力的战场。
阿Lee | 10年嵌入式老兵转AI | 口述编程vibe-coding专栏
专栏导航:[Ch1]认知 → [Ch2]工具 → [Ch3]环境 → [Ch4]进阶 → [Ch5]心法 →[Ch6]第一次→ [Ch7-10]实操 → [Ch11]变现 → [Ch12]避坑
