这是系列的第 13 篇。整个系列写给零基础、想入行 AI 的朋友每天一篇30 天后你会做出 3 个能写进简历的项目。这篇解决什么问题铺垫十二天今天正式开工做简历上的第一个项目。为什么第一个项目选“文件整理”因为它是零基础最好的练手题材需求你天天遇到下载文件夹里堆了几百个文件技术正好覆盖你这一周学的全部内容API 调用、提示词、结构化输出、多轮对话、重试兜底而且做完能拿去真实用不是摆着好看的 demo。更重要的是这个项目里有一个面试官爱听的东西它是用 AI 解决了一个具体问题而不是写了个聊天框。今天的安排上午搭骨架下午写核心逻辑今天就要让它跑起来。代码我会拆成几段跟着敲。一、先把需求想清楚不要一上来就写代码。先问自己三个问题这三个问题的答案决定了代码怎么写。问题一要整理什么文件答某个文件夹里的所有文件。问题二怎么分类答让 AI 看文件名判断它属于哪一类比如图片、文档、视频、代码、压缩包或者“其他”。问题三归到哪里去答在同一个文件夹下按类别建子文件夹把文件移进去。需求理清了代码结构自然就有了读取文件列表、让 AI 判断类型、按类型移动。三步。二、骨架先把文件列表拿到手新建项目文件夹 ai-file-organizer里面建一个 organizer.py。第一步用 Python 读取目标文件夹里的所有文件importosdefget_files(folder):拿到文件夹里的所有文件不包含子文件夹files[]fornameinos.listdir(folder):# 列出文件夹里的所有东西pathos.path.join(folder,name)# 拼出完整路径ifos.path.isfile(path):# 只要文件跳过文件夹files.append(name)returnfiles# 先试试能不能拿到列表folderrC:\Users\你的用户名\Downloads# 换成你自己的文件夹路径print(get_files(folder))跑一下看看能不能打印出你的文件列表。这一步跑通了说明基础能力没问题。路径前面那个 r 要注意它表示“后面的斜杠不当转义符处理”Windows 路径加上它最省心。三、核心让 AI 判断文件该归哪类这一步是 Day 9 结构化输出的实战。关键设计有两个用 JSON 拿结构化结果以及一次批量处理而不是一个文件问一次。为什么批量因为一个文件问一次 API100 个文件就是 100 次请求又慢又贵。把文件名拼成一批发过去一次就能拿到全部判断成本能降几十倍。importjsonfromopenaiimportOpenAI clientOpenAI(api_key你的密钥,base_urlhttps://api.deepseek.com)defclassify(files):把一批文件名交给 AI返回 {文件名: 类别} 的字典# 把文件名拼成一段文本file_list\n.join(files)promptf你是一个文件整理助手。请根据下面的文件名判断每个文件属于哪个类别。 类别只能是图片、文档、视频、音频、代码、压缩包、其他。 严格按以下 JSON 格式输出不要输出任何其他内容 {{文件名1: 类别, 文件名2: 类别}} 文件名列表{file_list}responseclient.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:prompt}])textresponse.choices[0].message.content# 清理 AI 可能加的代码块标记Day 9 讲过的坑texttext.strip().removeprefix(json).removesuffix().strip()returnjson.loads(text)# 转成 Python 字典注意提示词里的要求写得很死类别只能是固定的七种格式必须严格。这是 Day 8 讲的原则把隐性要求变成显性要求。类别限制住AI 才不会给你发明出“临时文件”“重要资料”这种没法建文件夹的名字。四、收尾移动文件拿到判断结果移动就简单了importshutildeforganize(folder,mapping):按判断结果把文件移进对应子文件夹forfilename,categoryinmapping.items():srcos.path.join(folder,filename)ifnotos.path.exists(src):# 文件可能已经不在了跳过continuedst_diros.path.join(folder,category)os.makedirs(dst_dir,exist_okTrue)# 文件夹不存在就建已存在也不报错shutil.move(src,os.path.join(dst_dir,filename))print(f{filename}-{category}/)用 shutil.move 而不是 os.rename前者能跨磁盘移动更通用。五、拼起来跑一遍主流程就是一个流水线if__name____main__:folderrC:\Users\你的用户名\Downloadsfilesget_files(folder)print(f发现{len(files)}个文件)mappingclassify(files)organize(folder,mapping)print(整理完成)重要提醒第一次跑先在一个测试文件夹里放十几个自己造的文件试试别直接对着真实的下载文件夹下手。确认没问题再上真家伙。看到文件一个个归到子文件夹里你的第一个 AI 应用就活了。常见报错排查报错一json.loads 解析失败。AI 在 JSON 外头加了说明文字。先 print(text) 看看它到底回了什么然后按 Day 9 的方法清理或者在提示词里把“不要输出任何其他内容”再强调一遍。报错二AI 返回的文件名和你发过去的不完全一致。比如你说的“报告最终版2.pdf”它可能给你写成“报告最终版2”。这就是我让你用if not os.path.exists(src): continue兜底的原因防止程序直接崩。也可以改成模糊匹配但那是进阶优化了。报错三文件太多一次发不完。比如上千个文件提示词会很长。可以分批处理每 50 个一批在代码里加个循环。这个优化留给你自己动手。报错四PermissionError权限不足。目标文件正被程序占用比如正在播放的视频。先关掉相关程序再跑或者跳过这个文件。报错五中文路径乱码。确保文件保存为 UTF-8。VSCode 右下角可以查看和切换编码。今天的作业把项目跑通用你自己的测试文件夹。截图整理前后的对比发到评论区。整理了多少个文件也可以说一下。如果你在 classify 那一步卡住了把 AI 的原始返回 print 出来贴上我帮你看。明天预告Day 14《项目一完工怎么把这个项目写进简历附模板句式》。今天代码能跑了但还比较“生”。明天做三件事加上错误处理和进度提示、整理代码结构然后重点讲一件事就是这个项目该怎么写进简历。同一个项目会写和不会写面试官看到的价值能差十倍。————————————————*系列目录30天从零开始学AI应用 开发