学习目标:
- 综合应用列表、字典、函数、文件读写、异常处理等知识
- 完成一个可交互、可持续保存的 学生信息系统
- 熟悉控制结构、输入验证、模块化思维
项目说明:
该项目将开发一个命令行运行下的学生信息管理系统,功能包括:
- 添加学生信息(姓名,年龄,成绩)
- 显示所有学生信息
- 查询某个学生
- 删除学生
- 保存到文件(退出时自动保存)
目标数据结构
学生信息保存为字典形式,列表中每一项是一个学生记录:
[{"name":"Tom","age":18,"score":90},{"name":"Jerry","age":20,"score":85}
]
1.系统主菜单
def show_menu():print("""
=======学生信息管理系统========
1.添加学生
2.显示所有学生
3.查找学生
4.删除学生
5.保存并退出
==============================
""")
说明:
- 用于每次循环中展示菜单,让用户知道哪些操作可以执行
- 多行字符"""..."""会原样打印格式化内容
2.添加学生信息
def add_student(students):name = input("请输入姓名:")age = input("请输入年龄:")score = input("请输入成绩:")try:students.append({"name":name.strip(), #去掉多余空格"age":int(age), #转换为整数,下同"score":int(score) })print("添加成功!")except ValueError:print("错误,年龄或成绩必须为数字!")
说明:
- 参数students是主程序维护的学生列表
- 用input()获取用户输入
- 使用try...except捕获用户输入非整数时的错误(例如int("abc")报错)
- 将学生信息以字典形式添加进students列表
3.显示学生信息(带格式表头)
def show_studnets(students):if not students:print("暂无学生信息。")returnprint(f"{'姓名':<10}{'年龄':<6}{'成绩':<6}")print("-"*22)for stu in students:print(f"{stu['name']:<10}{stu['age']}{stu['score']:<6}")
说明:
- 若学生列表为空,输出提示。
- 使用格式化对齐方式:<10 表示字段占宽度为10,左对齐。
- 遍历students列表,并逐行输出字典中信息
4.查找学生
def find_studnet(students):name = input("请输入要查找的学生姓名:")found = Falsefor stu in students:if stu['name'] == name:print("找到:",stu)found = Truebreakif not found:print("没有找到该学生")
5.删除学生
def delete_student(students):name = input("请输入需要删除的学生姓名:")for stu in students:if stu['name'] == name:studnets.remove(stu)print("删除成功!")returnprint("没有找到该学生。")
6.保存学生数据到文件(CSV格式)
def save_to_file(students,filename="students.txt"):with open(filename,"w",encoding="utf-8") as f:for stu in students:f.write(f"{stu['name']},{stu['age']},{stu['score']}\n")print("信息已保存至文件。")
说明:
- 默认保存为students.txt
- 使用with open()自动关闭文件
- 使用csv结构的形式保存,每行一个学生(逗号分隔)
7.从文件加载数据
def load_from_file(filename="studnets.txt")students = []try:with open(filename,"r",enconding="utf-8") as f:for line in f:if line.strip() == "":continue # 跳过空行name,age,score = line.strip().split(",")students.append({"name":name,"age":int(age),"score":int(score)})except FileNotFoundError:print("首次运行,未发现保存文件。")return students
说明:
- 若文件不存在不会报错,会创建空列表。
- 每行读取后去除换行符并按逗号分割。
- 恢复未列表中包含字典的结构。
8.主程序入门及程序入口判断
def main():students = load_from_file()while True:show_menu()choice = input("请输入选项:")if choice == "1":add_student(students)elif choice == "2":show_students(students)elif choice == "3":find_student(students)elif choice == "4":delete_student(students)elif choice == "5":save_to_file(students)breakelse:print("无效输入,请重新选择。")if __name__ == "__main__" # 程序入口判断main()
说明:
- 主循环永远运行,直到输入5退出
- 用户每次输入菜单项时,会跳转到对应功能
- 程序入口判断模块保证该模块被“直接运行时”才执行main
- 被其它模块import时不会执行main