Python实战项目05:JSON数据解析与数据可视化小案例|全套实战闭环

📌 实战系列:Python零基础综合实战项目(第5/5套)

🎯 项目定位:本专栏最后一个实战项目。掌握JSON数据读写解析,结合matplotlib完成数据图表绘制。日常开发、接口返回、爬虫拿到的数据大多为JSON格式;可视化可以直观展示统计结果,完成从原始数据 → 解析处理 → 图表输出完整链路。

✅ 项目难度:⭐⭐⭐

✅ 前置知识:字典、列表、文件读写、异常处理、第三方库pip安装

✅ 学到的核心能力

  • Python内置json模块,json字符串与字典/列表相互转换

  • 读取本地JSON文件、写入保存JSON文件

  • 解析结构化JSON业务数据,提取目标字段

  • matplotlib绘制柱状图,中文乱码解决

  • 图表保存到本地图片文件

  • 数据过滤、简单统计计算,完整数据处理流程


一、项目需求说明

模拟一份学生考试成绩JSON数据,完成整套数据处理流程:

  1. 构造模拟JSON格式学生成绩数据,保存到本地 score_data.json

  2. 读取本地JSON文件,解析为Python列表嵌套字典对象

  3. 遍历解析数据,提取姓名、分数,做简单统计(最高分、最低分、平均分)

  4. 使用matplotlib绘制成绩柱状图,X轴学生姓名,Y轴考试分数

  5. 解决matplotlib中文乱码,图表保存为本地图片 score_chart.png

  6. 异常捕获:json文件损坏、文件不存在、数据格式错误容错

  7. 筛选及格/不及格学生,输出控制台统计报表


二、核心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解析异常捕获


七、课后拓展作业

  1. 读取JSON数据,按照分数降序排序,再绘制柱状图。

  2. 新增饼图,统计及格与不及格人数占比,保存为饼图图片。

  3. 模拟接口返回json字符串,使用loads解析字符串,不读取本地文件。

  4. 过滤分数大于等于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零基础教程完结

相关推荐
belldeep1 小时前
python:wps2md
python·wps2md
IvanCodes1 小时前
Python 正则表达式(十四):文本匹配、查找与替换
开发语言·python·正则表达式
夜雪一千1 小时前
Python URL编码踩坑:单层编码、双重编码实战解析
开发语言·python
茶栀(*´I`*)1 小时前
【Python数据可视化】Matplotlib从零到精通:图表核心解剖、多子图布局与三大经典图表实战
python·信息可视化·matplotlib
SelectDB技术团队1 小时前
Agent Trace 数据底座建设:宽表建模、全文检索与成本聚合的配置与验证步骤
大数据·python·clickhouse·elk·elasticsearch·全文检索·复杂查询
计算机源码社1 小时前
【27届大数据毕设】基于Spark的TikTok短视频属性分享与互动比率可视化分析系统 基于机器学习的TikTok短视频认证属性与互动效能关联分析
大数据·hadoop·python·机器学习·spark·毕业设计·课程设计
IT研究室1 小时前
最新大数据毕业设计选题推荐-基于大数据的生活指数分析与可视化-大数据-Spark-Hadoop-Bigdata
大数据·信息可视化·数据分析·spark·课程设计
北冥有鱼被烹2 小时前
Linux timeout 命令完全指南:指定固定时间并发送固定信号
python
SunnyDays10112 小时前
如何使用 Python 将 PowerPoint(PPT 或 PPTX)转换为 Markdown
python·ppt转markdown·pptx转markdown·powerpoint转md