文章

Python 首批细教程 · 02B:把成绩工具升级成 JSON 成绩册

#269 · 2026-05-13 · Python 教程拆解
Reading Path / PYTHON 先抓主张,再转成行动 #269 · Python 教程拆解 · 读完进入产品或下一篇

承上启下:在上一篇《Python 首批细教程 · 02A:用函数和模块做一个成绩统计 CLI》中,我们通过模块化的结构和防错校验,在内存中完成了一套完整的成绩输入与统计。然而,内存中的数据会在程序关闭后瞬间消失。在本篇中,我们将迈出数据持久化的第一步,使用 Python 内置的 json 模块,将我们熟悉的列表和字典序列化写入磁盘,打造一个即使程序重启也依然保留数据的 JSON 成绩册。

对应原仓库Day01-15/11.文件和异常.mdDay01-15/07.字符串和常用数据结构.md

已提供可运行示例/tutorial-assets/python-100-days/02b-gradebook-json/(站点源码路径:blog-src/static/tutorial-assets/python-100-days/02b-gradebook-json/

上一节我们把成绩统计做成了 CLI,这一节再往前走一步:把数据保存下来

目标

程序启动时读取 gradebook.json,录入新学生后写回文件。这样你第二次启动程序,之前录的人成绩还在。

Step 1:准备 JSON 文件

示例目录已经提供 gradebook.json(站点源码路径:blog-src/static/tutorial-assets/python-100-days/02b-gradebook-json/gradebook.json):

[
  {"name": "张三", "score": 88},
  {"name": "李四", "score": 92}
]

Step 2:写读写函数

示例目录已经提供 storage.py(站点源码路径:blog-src/static/tutorial-assets/python-100-days/02b-gradebook-json/storage.py):

import json
from pathlib import Path


DATA_FILE = Path("gradebook.json")


def load_records() -> list[dict]:
    if not DATA_FILE.exists():
        return []
    with DATA_FILE.open("r", encoding="utf-8") as file:
        return json.load(file)


def save_records(records: list[dict]) -> None:
    with DATA_FILE.open("w", encoding="utf-8") as file:
        json.dump(records, file, ensure_ascii=False, indent=2)

Step 3:写主程序

示例目录已经提供 main.py(站点源码路径:blog-src/static/tutorial-assets/python-100-days/02b-gradebook-json/main.py):

from storage import load_records, save_records


def main():
    records = load_records()
    print("当前已有记录:", records)

    while True:
        text = input("输入 姓名,分数;输入 q 退出: ").strip()
        if text.lower() == "q":
            break
        try:
            name, score_text = text.split(",")
            score = int(score_text.strip())
            records.append({"name": name.strip(), "score": score})
        except ValueError:
            print("输入格式错误,例如:王五,76")

    save_records(records)
    print("保存完成")


if __name__ == "__main__":
    main()

运行:

cd blog-src/static/tutorial-assets/python-100-days/02b-gradebook-json
python main.py

你会得到什么

这一步其实已经在做一个最小的数据持久化系统了:

  • 用列表组织多条记录;
  • 用字典表示单条记录;
  • 用 JSON 存到磁盘;
  • 用异常处理拦住坏输入。

进阶任务

  1. 增加“按姓名查询成绩”功能。
  2. 增加“删除某个学生”功能。
  3. 写一个“只保留最高 5 分记录”的函数。

常见坑

  • 忘记 ensure_ascii=False,中文会变成 Unicode 转义。
  • 读文件时没判断文件是否存在。
  • 写 JSON 时不加 indent=2,后面很难人工查看。

💡 下一篇预告:借助 JSON 文件,我们成功解决了数据的持久化难题。但在复杂的 Web 开发与协作场景中,仅凭单机文件无法提供高并发、结构化的多用户交互服务。在下一篇《Python 首批细教程 · 03A:从 HTML 表单到 SQLite,一步做出本地留言板》中,我们将把视野拓宽到网络与数据库工程,使用 HTML 编写留言表单,配合 Python 内置的 HTTP 服务和 SQLite 嵌入式数据库,动手搭建起一个有页面、有接口、有数据库存储的本地留言板原型。