作者:许灼灼
一、课堂故事
「同学们,把上节课的作业交上来。」
教室里一片翻书包的声音。小明在电脑前手忙脚乱——桌面上密密麻麻几十个文件:「通知模板.docx」「通知模板(1).docx」「通知模板最终版.docx」「通知模板最终版(2)改.docx」……
「老师,」小明哭丧着脸,「我找不到我写的那份了……桌面上 Python 文件有三十多个,Word 文件有二十多个,还有一堆截图。」
我走过去瞟了一眼他的桌面。文件图标铺满了整个屏幕,文件名里夹杂着「新建文件夹」「新建文件夹(1)」「新建文件夹(2)」。PPT、Excel、Word、Python、截图——五世同堂,大乱炖。
「你知道吗,」我靠在他桌边,「你现在经历的,是每个学编程的人都经历过的——『文件管理破产危机』。但好消息是:Python 自己能整理文件。」
全班抬头。
「Python 自带两个模块——os 和 shutil。」我在白板上写,「os 是你的『眼睛』,能看到文件夹里有什么文件;shutil 是你的『手』,能复制、移动、删除文件。两个搭配起来——」
「就是一台全自动桌面整理机器人。」小明接话。
「对。10 行代码,把你桌面上所有 .py 文件归到一个文件夹、所有 .docx 归到另一个、所有截图归到第三个。从此告别『找不到文件』的痛苦。」
二、概念解释
os 和 shutil:Python 内置的文件管家
你可能没注意到——Python 其实自带了一套操作文件和文件夹的工具,不用 pip 安装,直接 import 就能用。
| | |
|---|
os | 列文件名、判断文件是否存在、创建/删除文件夹、路径拼接 | |
shutil | | |
核心操作速查表
| | |
|---|
| | |
| | |
| | |
| | |
| | |
| | |
| os.path.join("a", "b.txt") | |
| os.path.splitext("a.txt") | |
| | |
| | |
| | |
| | |
| | |
三、拆开看
第 1 步:看一眼文件夹里有什么——listdir()
import os # 看一眼当前文件夹里有什么 文件列表 = os.listdir(".") print(文件列表) 输出可能是这样的:
['pip入门文章.md', 'openpyxl读取文章.html', '成绩单.xlsx', '截图001.png', '通知模板.docx', 'CSV文件文章.md', '迷你日记本文章.html'] 一堆文件混在一起。我们的目标是把它们按类型分开。
第 2 步:按后缀分类——筛选特定类型文件
import os # 只看 .py 文件 所有文件 = os.listdir(".") py文件 = [f for f in 所有文件 if f.endswith(".py")] print("Python文件:", py文件) f.endswith(".py") 判断文件名是不是以 .py 结尾。换成 .docx、.xlsx、.png 同理。
第 3 步:批量重命名——给乱糟糟的文件起个像样名字
小明桌面上截图全是「截图001.png」「截图002.png」……想换成有意义的文件名:
import os 文件列表 = os.listdir(".") 序号 = 1 for 文件名 in 文件列表: if 文件名.startswith("截图") and 文件名.endswith(".png"): 新名字 = f"Python学习笔记_{序号:03d}.png" os.rename(文件名, 新名字) print(f"{文件名} → {新名字}") 序号 += 1 输出:
截图001.png → Python学习笔记_001.png 截图002.png → Python学习笔记_002.png 截图003.png → Python学习笔记_003.png :03d 的意思是用三位数字,不足前面补零——001、002、003。排序不会乱。
第 4 步:创建文件夹 + 移动文件——给桌面分区
这是核心操作!思路:看看有哪些文件类型 → 为每种类型创建文件夹 → 把文件搬进去。
import os import shutil # 定义分类规则:后缀 → 文件夹名 分类规则 = { ".py": "Python文件", ".md": "Markdown文件", ".docx": "Word文件", ".xlsx": "Excel文件", ".png": "图片", ".jpg": "图片", ".txt": "文本文件", } 所有文件 = os.listdir(".") for 文件名 in 所有文件: # 跳过文件夹本身 if os.path.isdir(文件名): continue # 拿到文件后缀 后缀 = os.path.splitext(文件名)[1].lower() # .lower() 统一转小写 # 这个后缀在我们的分类规则里吗? if 后缀 in 分类规则: 目标文件夹 = 分类规则[后缀] # 如果文件夹还不存在,创建它 if not os.path.exists(目标文件夹): os.mkdir(目标文件夹) print(f"📁 创建文件夹:{目标文件夹}") # 移动文件 shutil.move(文件名, os.path.join(目标文件夹, 文件名)) print(f"📄 {文件名} → {目标文件夹}/") print("\n✅ 桌面整理完毕!") 运行后,乱糟糟的文件夹变这样:
📁 Python文件/ ├─ pip入门文章.py └─ ... 📁 Word文件/ ├─ 通知模板.docx └─ ... 📁 Excel文件/ ├─ 成绩单.xlsx └─ ... 📁 图片/ ├─ Python学习笔记_001.png └─ ... 第 5 步:遍历子文件夹——os.walk()
上面 os.listdir(".") 只看当前文件夹。要深入所有子文件夹,用 os.walk():
import os for 根目录, 子文件夹列表, 文件列表 in os.walk("."): print(f"\n📁 当前目录:{根目录}") if 文件列表: print(f" 包含 {len(文件列表)} 个文件") for 文件 in 文件列表[:3]: # 只展示前 3 个 print(f" 📄 {文件}") 第 6 步:清理垃圾——找出「(1)」「最终版」「副本」
import os 关键词 = ["(1)", "(2)", "副本", "最终版", "新建", "无标题"] 所有文件 = os.listdir(".") for 文件名 in 所有文件: if os.path.isfile(文件名): for 关键词 in 关键词: if 关键词 in 文件名: print(f"🗑️ 疑似垃圾文件:{文件名}") # os.remove(文件名) # 真要删就取消注释 break 先把注释跑一遍确认列表没问题,再取消注释真删。
第 7 步(进阶):按日期归档
import os import time from datetime import datetime 三个月前 = time.time() - 90 * 24 * 60 * 60 # 90天前的秒数 for 文件名 in os.listdir("."): if os.path.isfile(文件名): 修改时间 = os.path.getmtime(文件名) # 文件最后修改时间 if 修改时间 < 三个月前: 日期 = datetime.fromtimestamp(修改时间).strftime("%Y-%m-%d") print(f"📅 {文件名} — 最后修改:{日期}(超过3个月)") 四、常见坑
坑 1:os.rename() 跨盘符不能用
Windows 下,os.rename() 只能在同一个盘内移动。跨盘必须用 shutil.move()。
# ❌ 跨盘重命名会报错 os.rename("C:/a.txt", "D:/a.txt") # ✅ 跨盘用 shutil.move shutil.move("C:/a.txt", "D:/a.txt") 坑 2:listdir() 只看一层,不递归
os.listdir() 只看当前文件夹,不进入子文件夹。想看全部子文件夹内容用 os.walk()。
坑 3:路径拼接别手拼,用 os.path.join()
# ❌ 手拼路径,Windows 和 Mac 不通用 路径 = "项目\Python文件\" + 文件名 # ✅ 用 os.path.join,自动适配操作系统 路径 = os.path.join("项目", "Python文件", 文件名) 坑 4:rmtree() 和 remove() 不可逆
没有回收站,删了直接消失。安全做法:先 print 确认要删的文件列表,核对无误后再执行删除。
坑 5:文件被占用时操作失败
Word 文档正打开着,Python 去 shutil.move() 或 os.remove(),会报 PermissionError。关掉再操作。
五、生活类比
🧹 你的房间 := 你的文件夹
想象你的桌面就是一个房间——
| |
|---|
| 文件散落根目录,.py .docx .png 混一起 |
| |
| |
| |
| |
| |
| |
一句话总结:os 是你的眼睛,shutil 是你的手——眼睛看清有什么,手把东西搬到该去的地方。
六、练一练
练习 1:列出所有 .py 文件
在当前文件夹里,用 os.listdir() 配合 endswith() 列出所有 Python 文件,打印文件名和文件大小(用 os.path.getsize())。
练习 2:批量加前缀
有一个文件夹里是十张照片(可以先创建十个空文件模拟)。写程序给它们统一加上前缀「2024寒假_」:
IMG001.jpg → 2024寒假_IMG001.jpg IMG002.jpg → 2024寒假_IMG002.jpg 练习 3:桌面整理机器人
在当前文件夹里(先手动放几个 .py、.docx、.png 文件模拟),写一个完整的「桌面整理机器人」:
1. 扫描所有文件
2. 按后缀自动创建子文件夹(Python文件、Word文件、图片等)
3. 把文件移到对应文件夹
4. 打印整理报告
挑战题:综合办公自动化
把前面学的全部串起来:
1. 准备一个 Excel 文件(学生成绩表)
2. 用 openpyxl 读取每个学生的姓名和各科成绩
3. 用 python-docx 为每个学生生成一份 Word 通知书
4. 把所有生成的 .docx 文件自动归到一个叫「通知书汇总」的文件夹里
5. 在文件夹里自动生成一份「生成记录.txt」,记录:生成时间、共生成多少份、学生名单
提示:最后一步用 os.mkdir() + shutil.move() + open() 写 txt 文件。
五件武器已全部到手:pip → openpyxl(读) → openpyxl(写) → python-docx → os + shutil。下节课是模块五的最后一篇——综合实战,五件武器全部上阵!
📦 本篇练习答案 + 全套习题包
做完题卡住了?别硬憋——这一篇的练习答案,以及已发各篇(while / for / 字符串切片 / 列表 vs 元组 / range / 字典键值对……)的答案 PDF,我都打包好了,在下面网盘里。
🔗 网盘链接:
https://pan.baidu.com/s/1QCLD4qj0wEuJgokiZf5SdQ?pwd=i273
💡 提取码 i273 已嵌在链接里,点开直接下,不用再输~
卡住了随时在公众号留言问我,或者直接回复关键词 答案 也能拿到。我看到都会回 👋