很多人学 Python 都会经历同一个阶段:教程看了一大堆,视频收藏了好几百个,可一旦关掉教程,面对空荡荡的编辑器,还是不知道第一行代码该写什么。语法都认识,函数也会调用,可为什么一到“自己做一个项目”就卡住?原因很简单:教程解决的是“知道”,项目解决的是“做到”。从“知道”到“做到”之间的这段路,才是初学者真正消耗时间的地方。
这篇文章不打算再给你一份“从入门到放弃”的收藏夹,而是把 Python 实战项目这件事讲透:80 个项目到底怎么分类、每一层练什么能力、从哪几个项目开始做、做到什么程度算过关。同时我会用 4 个核心项目,把从命令行脚本、办公自动化、爬虫入门到 Web 框架的完整路径走一遍。如果你正准备学 Python,或者已经学了一两个月但仍停留在“能看懂、不会写”的状态,这篇文章值得耐心读完。
先给一个明确判断:80 个实战项目并不是让你一个不落全部做完,它更像是一份“按需取用”的训练地图。真正的目标不是刷数量,而是通过不同类型的项目,把 Python 的基础语法、数据处理、网络请求、框架开发等能力串成一条完整的技能链。了解这一点,你才不会在收藏之后继续焦虑。
1. 为什么学 Python 最终要落到实战项目上
很多初学者有个误区,认为学编程的顺序应该是“把语法学完,再开始做项目”。但真实情况是,语法是学不完的。Python 的标准库加上第三方生态,光内置函数和常用模块就有几百个,你真的要全部背下来才开始写代码吗?显然不现实。
正确的路径应该是“用项目倒逼学习”。你做一个通讯录管理系统,自然会在实际需求中理解列表、字典、文件读写、异常处理这些语法点;你做一个 Excel 合并工具,自然会被迫去查 pandas 的 API 文档,然后再慢慢记住常用的操作。这种“先遇到问题、再带着问题去查资料”的学习方式,记忆留存率远高于漫无目的地看教程。
项目还承担着另一个重要职责:它让你的代码离开“能运行”这个最低标准,开始思考“能维护”。只写一个test.py跑通逻辑,和设计一个目录结构合理、有清晰函数分工、有输入异常处理的完整项目,完全是两种体验。前者让你产生“我学会了”的错觉,后者才会让你真正体会到工程化的味道。80 个项目中,不同层级正是在帮你逐步建立这种工程意识。
另外,项目也是你简历和面试中最直接的表达能力。面试官问“你 Python 掌握得怎么样”,你用“我看完了某本教材”来回答,完全没有说服力;但你如果能把自己的项目从功能设计、模块拆分到数据处理流程讲清楚,对方就能在十几分钟内判断出你的真实水平。可以说,项目作品就是程序员最诚实的能力说明书。
2. 80 个 Python 实战项目怎么分层
给 80 个项目分层,不是要把你难住,而是让你随时知道“我现在处于哪个阶段,下一个阶段该练什么”。我把项目按难度和方向分为 8 类,每类 10 个,覆盖基础语法、办公自动化、数据存储、爬虫、数据分析、Web 框架、工程测试和 AI 进阶。
2.1 第一类:基础语法与小型工具项目
这类项目适合完全零基础或者刚学语法两周以内的读者,主要目的一是熟练掌握变量、循环、条件判断、函数、字符串处理等基础语法,二是让你体会到“用代码解决一个具体小问题”的成就感。
| 序号 | 项目名称 | 核心知识点 |
|---|---|---|
| 1 | 猜数字游戏 | random 随机数、循环、条件分支 |
| 2 | 命令行计算器 | 函数定义、字符串解析 |
| 3 | 九九乘法表格式化输出 | 嵌套循环、格式化字符串 |
| 4 | 学生成绩统计工具 | 列表、字典、基础统计 |
| 5 | 文件批量重命名工具 | os 模块或 pathlib 文件操作 |
| 6 | 密码强度检测器 | 字符串处理、正则表达式入门 |
| 7 | 命令行待办清单 | list 操作、简单持久化 |
| 8 | 汇率换算小程序 | 数学运算、实时汇率接口可选 |
| 9 | 随机红包金额分配器 | random 随机算法、浮点数精度 |
| 10 | 命令行单位换算工具 | 条件分支、函数封装 |
这一层不要追求代码多么优雅,先保证每段代码的分支逻辑你都理解。比如猜数字游戏,为什么输入数字后需要判断“大了”“小了”“相等”,这个 if-elif-else 结构就是后面所有业务逻辑的基础。
2.2 第二类:文件处理与办公自动化
当基础语法过关后,最贴近真实职场需求的方向就是办公自动化。这类项目能把重复的 Excel、Word、PDF 操作变成一段脚本,是很多非技术岗、运维岗、测试岗同学最先尝到甜头的领域。
| 序号 | 项目名称 | 核心知识点 |
|---|---|---|
| 11 | 多 Excel 文件合并工具 | pandas、glob 文件遍历 |
| 12 | Word 批量生成通知/证书 | python-docx 模板操作 |
| 13 | PDF 合并与拆分工具 | PyPDF2 或 pypdf |
| 14 | 文件夹自动整理工具 | pathlib、shutil 移动文件 |
| 15 | 日志文件关键字统计 | with 打开文件、正则、计数器 |
| 16 | 图片批量压缩工具 | Pillow 图像处理 |
| 17 | CSV 转 Excel 并美化 | pandas、openpyxl 样式 |
| 18 | 定时邮件发送小工具 | smtplib、email、schedule 定时 |
| 19 | 文本文件差异对比器 | difflib 标准库 |
| 20 | 定时报表生成助手 | 数据读取、Excel 写入、自动化 |
做这类项目时,你会频繁接触“文件不存在”“编码错误”“路径写错”这些真实问题,而这些恰恰是工作中的高频故障点。解决问题的过程,比任何教程都更能加深记忆。
2.3 第三类:数据存储与信息管理项目
从这一层开始,项目不再是跑完就结束的一次性脚本,而会涉及数据的持续保存和管理。你需要把数据写入 JSON、SQLite 或者 MySQL,再把这些数据读出来展示或修改。
| 序号 | 项目名称 | 核心知识点 |
|---|---|---|
| 21 | JSON 通讯录管理系统 | JSON 文件读写、函数模块化 |
| 22 | SQLite 图书管理助手 | sqlite3、SQL 基础 |
| 23 | 学生选课信息管理系统 | SQLAlchemy、MySQL 基础 |
| 24 | Redis 缓存应用练习 | Redis 连接、缓存读写 |
| 25 | 仓库库存进销存系统 | 数据表设计、事务操作 |
| 26 | 本地博客文章管理工具 | 文件组织、元数据管理 |
| 27 | 影音收藏管理工具 | 多表查询、条件筛选 |
| 28 | 本地密码保险箱 | cryptography 加密库、权限管理 |
| 29 | 会议室预订系统 | 时间冲突判断、数据持久化 |
| 30 | 文件分类与查重工具 | 哈希计算、文件遍历 |
需要提醒的是,像“本地密码保险箱”这类项目,真实场景中不要自己发明加密算法,而是使用经过验证的加密库。涉及密码、密钥等敏感信息时,一定要遵守“最小权限”原则,而且只在自己的测试环境里做实验。
2.4 第四类:爬虫与数据采集项目
爬虫是 Python 生态中最热门的方向之一,也是很多初学者想尝试的领域。但必须先说清楚一个边界:爬虫只能采集公开、合法、并且目标站点允许访问的数据,动手前要确认目标网站的用户协议、robots.txt 和相关法律法规。把爬虫用于绕过访问控制、批量窃取他人未授权数据,既不合规也不安全,这类技术绝不能碰。
| 序号 | 项目名称 | 核心知识点 |
|---|---|---|
| 31 | 静态文章列表采集 | requests、BeautifulSoup 基础 |
| 32 | 新闻标题聚合器 | HTML 解析、字符串清洗 |
| 33 | 天气实况查询工具 | 公开 API 请求、JSON 解析 |
| 34 | 公开招聘信息分析采集 | 页面解析、去重与脱敏 |
| 35 | 电商商品公开页价格监控 | 定时抓取、变化通知 |
| 36 | 授权素材站图片下载器 | 文件流写入、批量下载 |
| 37 | 通用翻页逻辑处理 | 分页 URL 规律、循环请求 |
| 38 | 异步并发采集入门 | aiohttp、asyncio 基础 |
| 39 | Cookie 与 Session 状态管理 | 会话保持、登录态模拟 |
| 40 | 采集数据清洗入库 | pandas 处理、SQLite 写入 |
初学者做爬虫,最容易收获见识也最容易踩到法律红线。不要碰需要账号密码才能看到的内容,不要高频请求打爆对方服务器,不要拿别人的付费数据做二次分发。更稳妥的做法是,先在用公开页面设计的测试站点上练习解析逻辑,再考虑真实业务。
2.5 第五类:数据分析与可视化
爬虫和办公自动化的下一步,通常是数据处理。这类项目要求你对拿到的数据做清洗、统计、分析和可视化,是数据分析师、运营分析、商业分析等方向的核心训练。
| 序号 | 项目名称 | 核心知识点 |
|---|---|---|
| 41 | 销售数据趋势分析 | pandas 分组聚合、日期处理 |
| 42 | 公开数据集缺失值清洗 | 空值处理、数据类型转换 |
| 43 | 招聘岗位关键词统计 | 分词、Counter 统计 |
| 44 | 公开统计数据可视化 | Matplotlib、Seaborn |
| 45 | 电商订单用户画像(脱敏) | 用户维度聚合、RFM 模型入门 |
| 46 | 股票历史数据 K 线绘制 | 在线数据接口、图表绘制 |
| 47 | 文本词云生成器 | jieba 分词、WordCloud |
| 48 | 学生成绩分布可视化 | 直方图、箱线图绘制 |
| 49 | 评论情感极性分析(公开数据集) | 情感词典、简单分类 |
| 50 | 销量回归预测小案例 | scikit-learn 线性回归 |
分析类项目最看重的是“拿到脏数据后怎么办”。当你发现日期有空值、金额带货币符号、同一用户重复出现时,如何设计清洗规则,比会调用groupby重要得多。
2.6 第六类:Web 框架与前后端开发
如果你目标是 Python 后端开发、全栈开发或测试开发,那么 Web 框架是躲不开的一关。Flask、FastAPI、Django 三个框架各有定位,入门阶段可以选一个主攻,理解路由、请求、响应、模板、数据库交互这套通用概念后,再迁移到其他框架会非常快。
| 序号 | 项目名称 | 核心知识点 |
|---|---|---|
| 51 | Flask 待办事项应用 | Flask 路由、模板渲染 |
| 52 | Flask 个人博客 | Flask + SQLite 完整 CRUD |
| 53 | FastAPI 图书管理接口 | FastAPI、Pydantic、RESTful |
| 54 | RESTful API 设计与测试 | GET/POST/PUT/DELETE 语义 |
| 55 | Django 投票应用 | Django 官方入门项目实战 |
| 56 | Django 个人博客 | ORM、Admin 后台、模板 |
| 57 | FastAPI + Vue 前后端分离 | 跨域处理、接口联调 |
| 58 | 文件上传与下载服务 | 表单上传、静态文件处理 |
| 59 | WebSocket 聊天室 | 长连接、异步消息 |
| 60 | 项目部署上云 | Gunicorn、Nginx、Linux |
做 Web 框架项目时,程序员常犯的错是在本地运行成功就觉得万事大吉。真实的开发环境还要考虑接口鉴权、参数校验、数据库连接池、日志、部署和回滚,这些内容在项目后期要逐步补上。
2.7 第七类:测试与工程效率工具
测试类项目容易被纯开发向的初学者忽略,但它恰恰是就业面很广的方向。很多 Python 岗位实际工作内容是自动化测试、接口测试、CI 流水线和内部工具开发。练好这一层,等于多了一条就业路径。
| 序号 | 项目名称 | 核心知识点 |
|---|---|---|
| 61 | Pytest 单元测试入门 | 测试函数、断言、fixture |
| 62 | Selenium UI 自动化用例 | 元素定位、显式等待 |
| 63 | Requests + Pytest 接口自动化 | 接口封装、测试报告 |
| 64 | 数据驱动测试用例 | 参数化、外部数据文件 |
| 65 | GitHub Actions 流水线实验 | 自动安装依赖、跑测试 |
| 66 | Click 命令行工具封装 | 命令行参数、子命令 |
| 67 | 配置文件读取与校验工具 | YAML/JSON、schema 校验 |
| 68 | 日志监控与告警脚本 | logging、定时扫描 |
| 69 | Ruff/Black 代码规范扫描 | 代码风格、自动格式化 |
| 70 | 项目脚手架生成器 | 模板文件、自动创建目录 |
自动化测试项目会让你重新审视自己写的业务代码:一个函数可不可测、接口设计得清不清楚、依赖注入是否合理,这些问题在写测试时都会暴露出来。从某种程度讲,会写测试的开发者和不会写测试的开发者,对代码质量的理解完全不在一个层次。
2.8 第八类:人工智能与综合进阶
最后一类适合基础扎实、想进一步探索算法或 AI 应用方向的读者。这里的项目并不要求你从头发明算法,而是通过成熟的库和模型,建立“会调库、会训练、会部署、会评估”的完整认知。
| 序号 | 项目名称 | 核心知识点 |
|---|---|---|
| 71 | 多进程/多线程下载器 | 并发模型、队列 |
| 72 | FastAPI + 定时任务综合后台 | 框架整合、任务调度 |
| 73 | Celery 异步任务队列入门 | 消息队列、异步任务 |
| 74 | PyTorch MNIST 手写识别 | Tensor、简单神经网络 |
| 75 | 垃圾邮件文本分类 | 文本向量化、朴素贝叶斯 |
| 76 | 大模型 API 文本助手 | API 调用、Prompt 设计 |
| 77 | 语音转文字工具 | 合法公开 API、音频处理 |
| 78 | 个人知识库管理工具 | Markdown 管理、全文检索 |
| 79 | 简易 RAG 问答 Demo | 向量化、检索增强生成 |
| 80 | 综合毕业设计:数据大屏 | 前后端 + 可视化 + 部署 |
从第 1 个项目做到第 80 个项目并不现实,也完全不必要。正确打开方式是:前两类必须扎实做完,第三、第四、第五类根据你的兴趣和目标方向选做,第六类如果你做后端方向就必须投入,第七类是测试方向的加分项,第八类是学有余力之后的“开眼界”项目。
3. 开始前的环境准备
有了项目清单,先别急着写代码,把开发环境搭好能省掉后续 80% 的劝退问题。
3.1 安装 Python
建议从 Python 官网下载安装包,版本选择 3.10 或更高即可。网站上的版本号会持续更新,本文不写死某个具体版本,因为大部分实战项目对版本并不敏感,稳定版本都能跑。Windows 安装时一定要勾选“Add Python to PATH”,否则命令行里执行python会提示找不到命令。
安装完成后,在终端执行下面命令验证:
python --version pip --version如果输出类似Python 3.x.x和pip 23.x.x from ...,说明环境正常。如果提示python不是内部或外部命令,先检查 PATH 配置,不要急着重装。
3.2 创建虚拟环境
每个实战项目最好独享一个虚拟环境,不要把所有依赖都装到全局。否则项目 A 依赖 pandas 1.x,项目 B 依赖 pandas 2.x,全局环境就会出现冲突。虚拟环境就是给每个项目准备一个“独立的小房间”,依赖互不干扰。
python -m venv .venv创建完成后,激活虚拟环境:
# Windows 下执行 .venv\Scripts\activate # macOS / Linux 下执行 source .venv/bin/activate激活成功后,终端提示符前面会多一个(.venv),看到它就知道当前在虚拟环境内。
3.3 安装常用依赖
把后续项目常用的库一次性装好并不推荐,因为项目不同依赖不同。但为了练习下面的 4 个示例项目,你可以先安装这一组:
pip install requests beautifulsoup4 pandas openpyxl fastapi uvicorn pytest安装慢时可以使用国内镜像源:
pip install requests beautifulsoup4 pandas openpyxl fastapi uvicorn pytest -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后,用下面的命令把依赖导出到文件,方便以后分享项目:
pip freeze > requirements.txtIDE 方面,初学者推荐 PyCharm Community Edition 或者 VSCode。VSCode 需要安装 Python 扩展,并在左下角选择刚才创建的.venv解释器,否则运行时会报找不到模块。
4. 四个具有代表性的实战项目与代码拆解
下面 4 个项目分别覆盖了四层:基础控制台程序、办公自动化、爬虫入门和 Web 框架。建议你按顺序动手实践,而不是只看代码。每段代码后面我都会解释关键逻辑和容易踩坑的地方。
4.1 入门必做:JSON 通讯录管理系统
第一个要做的是“能保存数据”的控制台程序。它虽然简单,但包含了完整项目的关键要素:函数拆分、数据持久化、用户交互循环。
# 文件路径:contact_book.py import json import os DATA_FILE = "contacts.json" def load_contacts(): if not os.path.exists(DATA_FILE): return [] with open(DATA_FILE, "r", encoding="utf-8") as f: return json.load(f) def save_contacts(contacts): with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(contacts, f, ensure_ascii=False, indent=2) def add_contact(contacts): name = input("姓名:").strip() phone = input("电话:").strip() if not name or not phone: print("姓名和电话都不能为空") return contacts.append({"name": name, "phone": phone}) save_contacts(contacts) print("添加成功") def search_contact(contacts): keyword = input("输入姓名或电话关键字:").strip() results = [ c for c in contacts if keyword in c["name"] or keyword in c["phone"] ] if not results: print("未找到匹配联系人") return for c in results: print(c["name"], c["phone"]) def main(): contacts = load_contacts() while True: print("\n1. 添加联系人") print("2. 查找联系人") print("3. 显示全部") print("4. 退出") choice = input("请选择操作:").strip() if choice == "1": add_contact(contacts) elif choice == "2": search_contact(contacts) elif choice == "3": for c in contacts: print(c["name"], c["phone"]) elif choice == "4": print("再见") break else: print("无效选项,请重新输入") if __name__ == "__main__": main()这个项目最关键的设计是“把数据加载到内存,操作后再写回文件”。你在内存中对contacts列表做增删改查,但如果不调用save_contacts,程序退出后数据就会丢失。理解这一点,就理解了几乎所有管理系统的数据流:读文件、操作数据、写文件。
json.dump(contacts, f, ensure_ascii=False, indent=2)中的ensure_ascii=False必须保留,否则中文会被保存成\u开头的转义序列,肉眼很难阅读。indent=2则是让 JSON 文件排版清晰,方便调试。
4.2 办公自动化:目录内 Excel 自动合并
第二个项目处理的是真实工作中最常见的需求:把一个文件夹里的多个 Excel 合并成一个。它用到的是数据分析和办公自动化领域的核心库 pandas。
# 文件路径:merge_excel.py from pathlib import Path import pandas as pd def merge_excel(folder: str, output: str = "merged.xlsx"): folder_path = Path(folder) files = list(folder_path.glob("*.xlsx")) + list(folder_path.glob("*.xls")) if not files: print("目录下没有 Excel 文件") return frames = [] for file in files: try: df = pd.read_excel(file) df["来源文件"] = file.name frames.append(df) print(f"已读取:{file.name}") except Exception as exc: print(f"读取 {file.name} 失败:{exc}") if frames: result = pd.concat(frames, ignore_index=True) result.to_excel(output, index=False) print(f"合并完成,共合并 {len(frames)} 个文件,输出到 {output}") if __name__ == "__main__": merge_excel("data")使用前先在同级目录下建一个data子文件夹,里面放几个表头结构一致的 Excel 测试文件,然后运行:
python merge_excel.py这里值得学习的点是df["来源文件"] = file.name。如果不加这一列,合并后的数据无法区分哪一行来自哪个文件,这在真实报表处理中是致命问题。另一个细节是pd.concat(frames, ignore_index=True),ignore_index=True会让合并后的行索引重新从 0 开始,避免多个子表索引重复。
主函数merge_excel("data")把目录名写成参数,后续如果想合并其他目录,直接传不同路径就可以,完全不需要改函数内部逻辑。这就是“可复用函数”和“一次性脚本”的差别。
4.3 爬虫入门:公开测试站点信息采集
爬虫项目一定要从安全、合规的练习场景开始。下面例子使用的books.toscrape.com是专门供爬虫入门练习的公开测试站点,页面本身就是普通公开内容,你自己在本地运行学习不存在越界问题。我依然要强调:换到真实目标时,先检查 robots.txt 和用户协议,控制抓取频率,只处理公开数据。
# 文件路径:books_crawler.py import requests from bs4 import BeautifulSoup def fetch_books(): url = "https://books.toscrape.com/" resp = requests.get(url, timeout=10) resp.encoding = resp.apparent_encoding soup = BeautifulSoup(resp.text, "html.parser") books = [] for article in soup.select("article.product_pod"): title = article.h3.a.get("title") price = article.select_one("p.price_color").text books.append({"title": title, "price": price}) return books if __name__ == "__main__": for idx, book in enumerate(fetch_books(), start=1): print(idx, book["title"], book["price"])运行后如果网络正常,会输出当前页面下大约 20 本书的标题和价格。遇到 403、超时或空列表时,第一件事不是改解析代码,而是检查网络联通性、目标站点是否可达、Headers 是否被限制。
这段代码的核心是 BeautifulSoup 的选择器语法。soup.select("article.product_pod")表示按 CSS 选择器匹配所有 class 为product_pod的 article 标签,article.h3.a.get("title")表示从每个 article 中继续取 h3 里的 a 标签,并读取它的 title 属性。初学者最常踩的坑是“结构写得太死”,一旦目标页面某个标签层级变化,代码就失效。所以学会先打印soup.title、soup.prettify()查看页面结构,再写选择器,是爬虫调试的正确打开方式。
4.4 Web 框架:FastAPI 构建待办事项接口
第四个示例进入 Python Web 框架。FastAPI 是目前入门成本低、生态成长快、非常适合做 API 服务的框架,它自带接口文档,写起来直观,是 Python 后端项目很好的起点。
# 文件路径:main.py from typing import List from fastapi import FastAPI, HTTPException from pydantic import BaseModel app = FastAPI(title="待办事项接口") class TodoItem(BaseModel): id: int title: str done: bool = False todos: List[TodoItem] = [] @app.get("/todos", response_model=List[TodoItem]) def list_todos(): return todos @app.post("/todos", response_model=TodoItem) def create_todo(item: TodoItem): if any(t.id == item.id for t in todos): raise HTTPException(status_code=400, detail="该 id 已存在") todos.append(item) return item @app.put("/todos/{todo_id}", response_model=TodoItem) def finish_todo(todo_id: int): for t in todos: if t.id == todo_id: t.done = True return t raise HTTPException(status_code=404, detail="待办事项不存在") @app.delete("/todos/{todo_id}") def delete_todo(todo_id: int): for i, t in enumerate(todos): if t.id == todo_id: todos.pop(i) return {"message": "删除成功"} raise HTTPException(status_code=404, detail="待办事项不存在")运行方式:
uvicorn main:app --reload启动后浏览器访问http://127.0.0.1:8000/docs,你会看到 FastAPI 自动生成的 Swagger 接口文档页面,可以直接在页面上测试每个接口。--reload是开发模式的热重载参数,改代码后服务自动重启,但生产环境不要使用。
这个示例明确展示了一个 Web 框架项目的本质:用装饰器把 URL 路径和 Python 函数绑定起来。@app.post("/todos")表示客户端向/todos发送 POST 请求时,执行create_todo函数。TodoItem继承自BaseModel,作用是做参数校验,比如客户端传了{"id": 1, "title": "学习"},Pydantic 会自动校验字段类型并填充默认值。如果你调用接口时少传了必填字段,FastAPI 会直接返回 422 错误,而不是让你在函数内部手动判断。
值得注意,这里的todos只是内存列表,服务重启数据就会丢失。教学阶段这样写完全没问题,但要做到真正可用的后端项目,后续必须接入 SQLite 或 MySQL,并把数据操作从路由函数中抽离出去。
5. 每个项目如何运行、测试与判断效果
写代码只是第一步,“怎么验证它真的对了”才是工程能力的分水岭。下面针对四个示例项目分别说明运行方式和判断标准。
JSON 通讯录管理系统适合用“手工操作路径”来验证。运行python contact_book.py,依次输入 1 添加联系人、3 显示全部、4 退出,然后再次运行程序并选择 3,如果上次添加的联系人还在,说明 JSON 持久化生效。接着故意输入空姓名,程序应提示“姓名和电话都不能为空”,说明异常分支也在正常工作。
Excel 合并工具用“构造小数据”来验证。在data目录放两个 Excel,第一个文件第一行是销售记录,第二个文件第一行是另一周销售记录,然后运行合并命令。正确结果是控制台打印出“已读取”每个文件和“合并完成”,合并后的merged.xlsx包含两个文件的所有记录,并且额外多了一列来源文件,能区分每行来自哪个原始文件。
爬虫项目用“网络输出”来验证。运行python books_crawler.py,正常结果会打印多条包含书名和价格的记录。如果页面结构发生调整,第一个要看的不是代码,而是先用浏览器手动访问目标 URL,确认页面能正常打开。然后可以在 Python 交互式环境中先执行requests.get(url).status_code,判断状态码是 200 还是 403,再决定是处理网络层问题还是解析层问题。
FastAPI 项目用接口文档来验证。启动uvicorn main:app --reload后,先在 Swagger 页面执行 POST 创建一个待办事项,再执行 GET 查看列表,接着执行 PUT 标记已完成,最后 DELETE 删除。每一步都观察 HTTP 状态码和返回 JSON。如果 POST 同一个 id 两次,第二次应收到 400 错误,这说明接口的参数校验和业务冲突判断都生效。也可以使用命令行 curl 验证同一个流程:
curl -X POST "http://127.0.0.1:8000/todos" \ -H "Content-Type: application/json" \ -d '{"id":1,"title":"完成项目训练","done":false}' curl "http://127.0.0.1:8000/todos"如果所有增删改查和异常分支都符合预期,这个项目才算真正完成,而不是“能启动就算通过”。
6. 常见问题与排查思路
实战练习中,运行报错是家常便饭,千万不要觉得是自己“不适合学编程”。绝大多数问题都有固定排查路径,下面列出新手最容易遇到的 8 类问题。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 提示 ModuleNotFoundError | 虚拟环境未激活或依赖未安装 | 在终端执行pip list查看已安装包 | 激活虚拟环境后执行pip install 包名 |
| 运行脚本后窗口 |