📌 实战系列:Python零基础综合实战项目(第5/5套)
🎯 项目定位:本专栏最后一个实战项目。掌握JSON数据读写解析,结合matplotlib完成数据图表绘制。日常开发、接口返回、爬虫拿到的数据大多为JSON格式;可视化可以直观展示统计结果,完成从原始数据 → 解析处理 → 图表输出完整链路。
✅ 项目难度:⭐⭐⭐
✅ 前置知识:字典、列表、文件读写、异常处理、第三方库pip安装
✅ 学到的核心能力
-
Python内置json模块,json字符串与字典/列表相互转换
-
读取本地JSON文件、写入保存JSON文件
-
解析结构化JSON业务数据,提取目标字段
-
matplotlib绘制柱状图,中文乱码解决
-
图表保存到本地图片文件
-
数据过滤、简单统计计算,完整数据处理流程
一、项目需求说明
模拟一份学生考试成绩JSON数据,完成整套数据处理流程:
-
构造模拟JSON格式学生成绩数据,保存到本地
score_data.json -
读取本地JSON文件,解析为Python列表嵌套字典对象
-
遍历解析数据,提取姓名、分数,做简单统计(最高分、最低分、平均分)
-
使用matplotlib绘制成绩柱状图,X轴学生姓名,Y轴考试分数
-
解决matplotlib中文乱码,图表保存为本地图片
score_chart.png -
异常捕获:json文件损坏、文件不存在、数据格式错误容错
-
筛选及格/不及格学生,输出控制台统计报表
二、核心API预习
-
json.dumps():Python对象转为json字符串 -
json.loads():json字符串转为Python对象 -
json.dump():Python对象直接写入json文件 -
json.load():读取json文件得到Python对象 -
matplotlib.pyplot.bar():绘制柱状图 -
plt.savefig():将图表保存为图片文件
三、安装依赖库
json属于Python标准库无需安装;matplotlib为第三方库,终端执行安装:
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
四、完整可运行源码(详细注释)
# =============================================
# 实战项目05:JSON解析 + 数据可视化案例
# 全套流程:构造JSON数据 → 文件读写 → 解析统计 → 绘制柱状图
# =============================================
import json
import matplotlib.pyplot as plt
# 解决matplotlib中文乱码、负号显示异常
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
JSON_FILE = "score_data.json"
def create_sample_json():
"""构造模拟学生成绩数据,写入本地JSON文件"""
student_data = [
{"name": "张三", "subject": "Python", "score": 88},
{"name": "李四", "subject": "Python", "score": 72},
{"name": "王五", "subject": "Python", "score": 95},
{"name": "赵六", "subject": "Python", "score": 59},
{"name": "孙七", "subject": "Python", "score": 66},
{"name": "周八", "subject": "Python", "score": 48},
{"name": "吴九", "subject": "Python", "score": 91},
{"name": "郑十", "subject": "Python", "score": 77}
]
with open(JSON_FILE, "w", encoding="utf-8") as f:
json.dump(student_data, f, ensure_ascii=False, indent=4)
print(f"✅ 模拟数据已生成,保存至 {JSON_FILE}")
def read_json_data():
"""读取并解析本地JSON文件"""
try:
with open(JSON_FILE, "r", encoding="utf-8") as f:
data = json.load(f)
return data
except FileNotFoundError:
print(f"❌ 文件 {JSON_FILE} 不存在,先调用生成模拟数据!")
except json.JSONDecodeError:
print("❌ JSON文件格式损坏,解析失败!")
except Exception as e:
print(f"❌ 读取异常:{str(e)}")
return None
def data_statistics(data_list):
"""数据统计:最高分、最低分、平均分、及格不及格统计"""
score_list = [item["score"] for item in data_list]
name_list = [item["name"] for item in data_list]
max_score = max(score_list)
min_score = min(score_list)
avg_score = sum(score_list) / len(score_list)
pass_stu = [s for s in data_list if s["score"] >= 60]
fail_stu = [s for s in data_list if s["score"] < 60]
print("\n========== 成绩统计报表 ==========")
print(f"总人数:{len(data_list)}")
print(f"🏆 最高分:{max_score}")
print(f"📉 最低分:{min_score}")
print(f"📊 平均分:{avg_score:.2f}")
print(f"✅ 及格人数:{len(pass_stu)}")
print(f"❌ 不及格人数:{len(fail_stu)}")
print("==================================\n")
return name_list, score_list
def draw_bar_chart(name_list, score_list):
"""绘制柱状图并保存图片"""
plt.figure(figsize=(10, 6), dpi=100)
plt.bar(name_list, score_list, color="#4472C4")
# 在柱子上方标注分数
for index, score in enumerate(score_list):
plt.text(index, score + 1, str(score), ha="center")
plt.title("Python班级成绩柱状图")
plt.xlabel("学生姓名")
plt.ylabel("考试分数")
plt.ylim(0, 105)
plt.tight_layout()
plt.savefig("score_chart.png")
plt.show()
print("✅ 图表已保存为 score_chart.png")
def main():
print("========== JSON解析与可视化工具 ==========")
# 生成模拟json数据
create_sample_json()
# 读取json
stu_data = read_json_data()
if stu_data is None:
return
# 统计分析
names, scores = data_statistics(stu_data)
# 绘制图表
draw_bar_chart(names, scores)
if __name__ == "__main__":
main()
五、项目运行说明
-
运行程序,自动生成
score_data.json模拟数据文件 -
读取JSON解析为Python列表字典,控制台输出完整统计报表
-
自动弹出绘图窗口,生成柱状图,同时保存图片
score_chart.png -
代码内置解决matplotlib中文乱码配置,Windows直接可用
-
包含文件不存在、JSON格式损坏异常捕获,程序不会直接崩溃
-
JSON写入设置
ensure_ascii=False,支持正常保存中文
六、核心知识点复盘
-
json模块:dump/load处理文件,dumps/loads处理字符串,中文存储要点
-
数据解析提取:列表推导式快速提取字段,业务数据过滤筛选
-
matplotlib绘图:画布设置、柱状图、文本标注、中文乱码解决方案、图片导出
-
完整数据流:模拟数据存储 → 文件读取 → 统计计算 → 可视化输出
-
健壮性处理:IO异常、JSON解析异常捕获
七、课后拓展作业
-
读取JSON数据,按照分数降序排序,再绘制柱状图。
-
新增饼图,统计及格与不及格人数占比,保存为饼图图片。
-
模拟接口返回json字符串,使用loads解析字符串,不读取本地文件。
-
过滤分数大于等于80分的优秀学生,单独输出报表并绘图。
八、课后拓展作业 完整参考答案
所有答案基于本项目源码拓展,可直接嵌入原有代码运行。
作业1:按分数降序排序后绘制柱状图
def sort_data_by_score(data_list):
"""按照分数降序排序"""
sorted_data = sorted(data_list, key=lambda x:x["score"], reverse=True)
name_sorted = [item["name"] for item in sorted_data]
score_sorted = [item["score"] for item in sorted_data]
return name_sorted, score_sorted
# main中调用
# names, scores = sort_data_by_score(stu_data)
# draw_bar_chart(names, scores)
作业2:绘制及格/不及格占比饼图
def draw_pie_chart(pass_count, fail_count):
label = ["及格","不及格"]
nums = [pass_count, fail_count]
plt.figure(figsize=(6,6),dpi=100)
plt.pie(nums,labels=label,autopct="%.1f%%",colors=["#548235","#C00000"])
plt.title("成绩及格不及格占比")
plt.savefig("score_pie.png")
plt.show()
print("✅ 饼图保存为 score_pie.png")
# 在data_statistics函数内获取数量后调用
# draw_pie_chart(len(pass_stu), len(fail_stu))
作业3:json字符串 loads解析,不读取本地文件
import json
# 模拟网络接口返回的json字符串
json_str = '''
[
{"name":"小明","score":82},
{"name":"小红","score":90}
]
'''
def parse_json_string():
obj = json.loads(json_str)
print("解析结果:", obj)
for s in obj:
print(f"姓名:{s['name']},分数:{s['score']}")
作业4:筛选80分以上优秀学生,输出报表并绘图
def filter_excellent_student(data_list):
excellent = [s for s in data_list if s["score"] >= 80]
if not excellent:
print("📭 没有80分以上优秀学生")
return [],[]
print("\n========== 80分以上优秀学生 ==========")
for stu in excellent:
print(f"{stu['name']} {stu['score']}分")
ex_name = [x["name"] for x in excellent]
ex_score = [x["score"] for x in excellent]
return ex_name, ex_score
# main调用示例
# ex_names, ex_scores = filter_excellent_student(stu_data)
# if ex_names:
# draw_bar_chart(ex_names, ex_scores)
拓展作业核心总结
-
sorted + lambda:对JSON解析后的列表字典进行业务排序
-
matplotlib饼图:实现占比统计可视化,autopct展示百分比
-
json.loads:处理接口返回的JSON字符串;json.load处理本地文件
-
列表推导式快速完成数据过滤,筛选符合条件业务记录
九、专栏整体总结
至此,Python零基础全套入门 + 5套实战项目全部完成。
学习路径回顾:基础语法 → 容器数据结构 → 函数 → 面向对象 → 文件读写 → 异常处理 → 第三方库 → 5个综合实战。
已经具备基础开发能力,可以继续学习方向:数据库、Web开发、爬虫进阶、数据分析、算法。
💖点赞 + 收藏 + 关注,全套Python零基础教程完结