行者孙Python

藏经篇- Day64 综合 Kata:本地文件版学员登记系统(读写存档)

📖 知识点回顾

  1. os.path.isfile() 判断文件是否存在

  2. with open() 读写文件,自动关闭

  3. w 覆盖写入 /a 追加写入

  4. split 字符串分割,类型转换

  5. try-except 做输入防护

  6. 列表 + 字典存储学员档案

业务规则:

  • 程序启动自动读取student.txt加载已有学员档案

  • 支持新增学员,新增记录保存到文件

  • 姓名不能为空,年龄为整数,6~30 岁

  • 输入非法时,捕获异常并提示,程序不崩溃

⚔️ Kata 实战任务

任务需求:

  1. 编写完整本地文件版学员登记系统

  2. 程序启动:判断 student.txt 是否存在,存在就读入文件,加载为列表字典;不存在则创建空学员列表

  3. 菜单功能:

    • 1:新增学员

    • 2:查看全部学员

    • 0:退出程序

  4. 新增学员时,做输入校验,异常捕获;新增成功,写入保存到 student.txt

  5. 全程使用 with 写法

参考代码

import os

FILE_NAME = "student.txt"

def load_students():
    """加载文件中的学员档案,返回学员列表"""
    student_list = []
    if os.path.isfile(FILE_NAME):
        with open(FILE_NAME, "r", encoding="utf-8") as f:
            lines = f.readlines()
            for line in lines:
                line = line.strip()
                if not line:
                    continue
                name, age_str, score_str = line.split(",")
                stu = {
                    "name": name,
                    "age": int(age_str),
                    "score": int(score_str)
                }
                student_list.append(stu)
    return student_list

def save_students(student_list):
    """把学员列表全部写入txt存档"""
    with open(FILE_NAME, "w", encoding="utf-8") as f:
        for stu in student_list:
            line = f"{stu['name']},{stu['age']},{stu['score']}\n"
            f.write(line)

def add_student(student_list):
    """新增学员,带异常校验"""
    name = input("请输入学员姓名:").strip()
    age_str = input("请输入学员年龄:").strip()
    score_str = input("请输入学员分数:").strip()
    try:
        age = int(age_str)
        score = int(score_str)
        if len(name) == 0:
            raise ValueError("姓名不能为空")
        if not (6 <= age <= 30):
            raise ValueError("年龄范围必须是6~30")
        if not (0 <= score <= 100):
            raise ValueError("分数范围必须是0~100")
    except ValueError as e:
        print(f"❌ 添加失败:{e}\n")
        return
    # 校验通过,加入列表并保存文件
    new_stu = {"name": name, "age": age, "score": score}
    student_list.append(new_stu)
    save_students(student_list)
    print("✅ 学员登记成功,已保存到文件!\n")

def show_students(student_list):
    """展示全部学员"""
    if len(student_list) == 0:
        print("📭 暂无学员档案\n")
        return
    print("===== 学员档案 =====")
    for index, stu in enumerate(student_list):
        print(f"{index+1} | 姓名:{stu['name']},年龄:{stu['age']},分数:{stu['score']}")
    print("====================\n")

def main():
    # 启动加载档案
    student_list = load_students()
    print("==== 本地学员登记系统 ====")
    while True:
        print("【菜单】")
        print("1.新增学员")
        print("2.查看全部学员")
        print("0.退出系统")
        choice = input("请输入功能编号:").strip()
        if choice == "1":
            add_student(student_list)
        elif choice == "2":
            show_students(student_list)
        elif choice == "0":
            print("👋 系统退出,档案已保存!")
            break
        else:
            print("⚠️ 输入选项无效,请重新选择\n")

if __name__ == "__main__":
    main()

 

运行示例

==== 本地学员登记系统 ====
【菜单】
1.新增学员
2.查看全部学员
0.退出系统
请输入功能编号:1
请输入学员姓名:小李
请输入学员年龄:17
请输入学员分数:95
✅ 学员登记成功,已保存到文件!

【菜单】
1.新增学员
2.查看全部学员
0.退出系统
请输入功能编号:2
===== 学员档案 =====
1 | 姓名:小明,年龄:16,分数:88
2 | 姓名:小红,年龄:15,分数:92
3 | 姓名:小刚,年龄:16,分数:75
4 | 姓名:小李,年龄:17,分数:95
====================

【菜单】
1.新增学员
2.查看全部学员
0.退出系统
请输入功能编号:0
👋 系统退出,档案已保存!

 

🧠 思考题

  1. 当前系统每次新增学员,直接用 w 模式整体重写全部数据。如果学员数量很大,这样写有没有弊端?

  2. 拓展需求:增加删除学员功能,该如何修改代码?

‹ 返回目录
🏠首页 Python 📦资源 👤关于我