Python 练手项目推荐:文件整理与账单统计
作者:菠萝爱吃肉2026.11.07 00:24浏览量:0简介:本文面向 Python 初学者,详解两个经典练手项目:文件自动整理器与消费账单统计器,从需求拆解、知识点映射、参考代码到验收标准与升级方向逐层展开,帮助读者在实践中掌握字符串、列表、字典、循环、文件操作与异常处理,建立“输入—判断—处理—输出”的程序思维,并学会用验收标准检验代码的健壮性。
一、为什么练手项目比死记语法更有效
很多初学者的困境是:语法书看了一遍又一遍,变量、循环、函数都能背出来,可一旦面对真实需求,仍然不知道从哪里下手。造成这种局面的根本原因,是知识没有被真正“用”过——没有经历过从需求拆解到代码落地的完整闭环。
一个合格的练手项目应当满足三个条件:
- 输入输出清晰:明确知道程序吃什么、吐什么,避免陷入“不知道做到什么程度算完成”的焦虑;
- 知识点密度适中:能覆盖字符串、列表、字典、循环、条件判断、文件操作等核心语法,又不会一次性引入过多陌生概念;
- 可扩展:完成基础版后还有明确的升级方向,能伴随自己的水平一起成长。
下面这两个项目代码量都不大,却完整覆盖上述三点,非常适合作为 Python 入门后的第一批实战。
二、项目一:文件自动整理器
1. 需求拆解
目标很朴素:自动扫描一个文件夹,把不同类型的文件移动到不同的子目录中。
.xlsx、.csv结尾的文件 →表格目录.docx、.pdf结尾的文件 →文档目录.jpg、.png结尾的文件 →图片目录.mp4、.mov结尾的文件 →视频目录- 其余文件 →
其他目录
2. 涉及的核心知识点
- 字符串处理:拆出扩展名并统一转小写,避免
.JPG与.jpg被当成两类; - 列表与字典:用字典维护“目录名 → 扩展名列表”的映射,再反转成“扩展名 → 目录名”的查找表;
- 循环与条件判断:遍历目录、逐个文件判断归属;
- 文件路径操作:使用路径拼接函数保证跨平台正确性;
- 创建文件夹与移动文件:目录不存在时自动创建,再完成移动;
- 异常处理:文件被占用、权限不足等情况都需要兜底,不能让程序一次报错就中断。
3. 参考实现
import osimport shutil# 分类规则外置成字典,改规则不用改逻辑RULES = {"表格": [".xlsx", ".csv"],"文档": [".docx", ".pdf"],"图片": [".jpg", ".png"],"视频": [".mp4", ".mov"],}OTHER = "其他"def build_ext_map(rules):"""把 {类别: [扩展名]} 反转成 {扩展名: 类别},查询更直接"""return {ext.lower(): catfor cat, exts in rules.items()for ext in exts}def unique_path(dir_path, filename):"""目标目录已有同名文件时,生成 name(1).ext 风格的新名字,避免覆盖"""base, ext = os.path.splitext(filename)candidate = os.path.join(dir_path, filename)i = 1while os.path.exists(candidate):candidate = os.path.join(dir_path, f"{base}({i}){ext}")i += 1return candidatedef organize(src_dir, dst_root):ext_map = build_ext_map(RULES)ok = fail = 0for name in os.listdir(src_dir):src = os.path.join(src_dir, name)if not os.path.isfile(src):continue # 跳过子目录ext = os.path.splitext(name)[1].lower()category = ext_map.get(ext, OTHER)try:dst_dir = os.path.join(dst_root, category)os.makedirs(dst_dir, exist_ok=True) # 目录不存在则自动创建shutil.move(src, unique_path(dst_dir, name))ok += 1except OSError as e:fail += 1print(f"移动失败:{name},原因:{e}")print(f"整理完成:成功 {ok} 个,失败 {fail} 个")
4. 验收标准:从“能跑”到“可靠”
很多人写完第一版就结束了,但真正拉开差距的是下面这几条验收标准:
- 重复执行不报错:第一次运行后源目录已空,第二次运行应安静地输出“成功 0 个”,而不是抛异常;
- 不覆盖同名文件:目标目录已存在同名文件时自动改名,这是文件操作类程序的生命线;
- 目录不存在自动创建:不要要求用户先手动建好五个文件夹;
- 统计成功与失败数量:程序要能“自我汇报”,方便事后核对;
- 规则可配置:分类规则放在字典甚至配置文件里,新增一种类型只改数据、不改代码。
5. 升级方向
基础版稳定后,可以按难度递进扩展:
- 按年月归档:从文件修改时间中取出年月,目录结构变成
图片/2024/07/的多级形式; - 自动清理空文件夹:整理结束后自底向上删除空目录;
- 查找重复文件:先比较文件大小粗筛,再对可疑文件计算哈希值,找出内容完全相同的文件;
- 生成整理日志:把每个文件的移动记录写入日志文件,出问题可回溯;
- 定时运行:借助操作系统自带的定时任务能力,让脚本每天自动整理一次。
三、项目二:消费账单统计器
1. 需求拆解
读取一份消费记录,每行包含日期、类型、金额、备注四个字段,例如:
7月1日 餐饮 35 午餐7月1日 交通 12 地铁
程序需要自动生成五项统计结果:当月总支出、每类支出金额、每日平均支出、最大单笔支出、各类别占比。
2. 数据结构设计
这个项目的核心训练点是用正确的数据结构组织数据:
- 用列表存放全部记录,每条记录是一个字典,方便按字段名取值;
- 用字典做聚合统计:
{类别: 累计金额}、{日期: 当日合计}各一个; - 追踪最大单笔支出时,只需在遍历中不断比较更新,无须额外排序。
3. 参考实现
from collections import defaultdictrecords = [{"date": "7月1日", "type": "餐饮", "amount": 35, "note": "午餐"},{"date": "7月1日", "type": "交通", "amount": 12, "note": "地铁"},]def summarize(records, budget=None):if not records:print("没有可统计的记录")returntotal = 0by_type = defaultdict(float)by_day = defaultdict(float)max_item = Nonefor r in records:amount = float(r["amount"])total += amountby_type[r["type"]] += amountby_day[r["date"]] += amountif max_item is None or amount > max_item["amount"]:max_item = rdays = len(by_day)print(f"当月总支出:{total:.2f} 元")print(f"每日平均支出:{total / days:.2f} 元(有记录 {days} 天)")print(f"最大单笔支出:{max_item['date']} {max_item['type']} "f"{max_item['amount']} 元({max_item['note']})")for t, v in by_type.items():print(f"{t}:{v:.2f} 元,占比 {v / total * 100:.1f}%")if budget is not None and total > budget:print(f"【预警】本月支出已超出预算 {total - budget:.2f} 元!")summarize(records, budget=2000)
4. 超出预算预警与后续扩展
把预算值作为参数传入,统计结束时与总支出比较,一旦超出就输出醒目的预警信息——这就是最朴素的“业务规则”实现。之后还可以继续扩展:
- 从 CSV 文件真实读入记录,而不是把数据写死在代码里;
- 对金额做合法性校验,容忍负数、非数字等脏输入;
- 统计结果导出为表格文件,便于留存和分享;
- 按月份拆分统计,支持多月趋势对比。
四、两个项目背后的通用程序思维
把两个项目放在一起看,会发现它们遵循同一个骨架:输入 → 判断 → 处理 → 输出。
- 文件整理器:输入是目录里的文件列表,判断是按扩展名归类,处理是建目录并移动,输出是统计结果;
- 账单统计器:输入是消费记录,判断是逐条累加与比较,处理是字典聚合,输出是五项统计与预警。
未来无论写数据采集脚本、数据分析程序还是后端接口,本质上都是这个骨架的变体。建议完成两个项目后,用同样的思路自拟第三个小需求(例如批量重命名、生成目录清单),把这套思维内化成习惯。
五、小结
练手项目的价值不在代码量,而在于“完整做完并做稳”。文件整理器训练的是文件系统操作与健壮性意识,账单统计器训练的是数据结构与聚合思维。把验收标准逐条落实、把升级方向逐个尝试,一个周末就能收获远超单纯看语法书的学习效果。

登录后可评论,请前往 登录 或 注册