> 文章列表 > [Python基础] 学生管理系统(存储读取学生信息)

[Python基础] 学生管理系统(存储读取学生信息)

[Python基础] 学生管理系统(存储读取学生信息)

学生管理系统:应该算是语言语法学习过程中一个比较适合测试语法熟练度的代码案例了。

文章目录

  • 思路
    • main(入口函数)
    • menu(菜单)
    • Add(新增学生)
    • Display()(显示学生)
    • Find()(查找学生)
    • Delete()(删除学生)
    • save()(存储数据
    • load()(读取数据)
  • 完整代码

思路

创建一个全局的students列表,列表中每个元素为字典类型,每个字典存放一个学生的所有信息。

通过入口函数链接所有操作

# 用一个全局变量存学生信息
# 该全局变量为列表,列表中每个元素都是字典,字典中存放一个学生的所有信息
students = []

main(入口函数)

  1. 开始前先读取数据,调用load()
  2. 通过一个while循环,进行不断的学习管理的相关操作,用choice接收menu的返回值,进行判断将执行哪个操作
def main():# 入口函数# 通过控制台交互print("---------------------------------------------------")print("                    学生管理系统                     ")print("---------------------------------------------------")# 开始前读取数据load()while True:# menu() 菜单choice = menu()if choice == '1':Add()elif choice == '2':Display()elif choice == '3':Find()elif choice == '4':Delete()elif choice == '0':print("学生管理系统: 退出成功!")sys.exit(0)else:print("输入有误, 重新输入")main()

menu(菜单)

  1. 菜单选项对应入口函数的选项,输入选项后返回给入口函数接收
def menu():print("---------------------------------------------------")print("1. 新增学生")print("2. 显示学生")print("3. 查找学生")print("4. 删除学生")print("0. 退出系统")print("---------------------------------------------------")choice = input("请输入选择: ")return choice

Add(新增学生)

  1. 学生设置四个属性:学号、姓名、性别、班级
  2. 用一个字典将学生的四个属性聚合起来,最后将字典添加到students列表中
  3. 最后进行save()(存储学生信息到文件)
def Add():print("[新增学生]: 开始")# 学号studentId = input("输入学号: ")# 姓名name = input("输入姓名: ")# 性别gender = input("输入性别: ")# 班级className = input("输入班级: ")# 用字典将学生信息聚合student = {'studentId' : studentId,'name' : name,'gender' : gender,'className' : className}global studentsstudents.append(student)    #将该学生写入列表中# 保存学生信息save()print("[新增学生]: 完成")

效果演示:
[Python基础] 学生管理系统(存储读取学生信息)

Display()(显示学生)

  1. 直接利用for循环遍历students列表,s代表列表中的每个元素,为字典类型,打印s的所有元素即可
def Display():print("[显示学生]: 开始")for s in students:print(f"[{s['studentId']}]\\t{s['name']}\\t{s['gender']}\\t{s['className']}")print(f"[显示学生]: 完成\\t共显示了{len(students)}条信息")

效果演示:
[Python基础] 学生管理系统(存储读取学生信息)

Find()(查找学生)

  1. 查找思路和显示相差不大,先输入要查找的学生姓名
  2. 遍历列表,通过对比输入的name,和每个学生的name,然后打印相应学生信息
  3. 由于会出现重名问题,最后也可以打印一共查找到相匹配学生的个数
def Find():print("[查找学生]: 开始")name = input("请输入要查找的学生姓名: ")count = 0   # 记录查找到的学生总数for s in students:if name == s['name']:print(f"[{s['studentId']}]\\t{s['name']}\\t{s['gender']}\\t{s['className']}")count += 1print(f"[查找学生]: 完成\\t共查找到{count}个匹配的学生")

效果演示:
[Python基础] 学生管理系统(存储读取学生信息)

Delete()(删除学生)

  1. 同样利用for循环遍历,通过对比输入的学号和列表中每个字典存储的学号
  2. 如果有该学生,利用remove()函数删除该学生
def Delete():print("[删除学生]:开始")studentId = input("输入要删除的学生的学号: ")for s in students:if(studentId == s['studentId']):print(f"删除了学生{s['name']}")students.remove(s)  #列表调用remove进行删除# 保存此时数据save()print("[删除学生]:完成")

效果演示:
[Python基础] 学生管理系统(存储读取学生信息)

save()(存储数据)

  1. 使用 with open() 语句来打开一个名为 data.txt 的文本文件,并指定了打开方式为写入模式和编码方式为 utf8
  2. 遍历 students 列表,将每个学生的信息写入到文件中
  3. 字符串格式化功能被用来将字典中的学生信息格式化为一行字符串,并使用制表符 \\t 分隔。
def save():# 存储学生信息with open('data.txt','w',encoding='utf8') as f:for s in students:f.write(f"{s['studentId']}\\t{s['name']}\\t{s['gender']}\\t{s['className']}")print(f'[存储数据成功] 共存储了 {len(students)} 条数据')

此时data.txt中的存储情况
[Python基础] 学生管理系统(存储读取学生信息)

load()(读取数据)

  1. 如果不存在data.txt文件,直接返回,不执行操作
  2. 读取数据前清空students,同样的操作,以’r’的方式打开data.txt
  3. 由于一个学生信息为四个元素,首先去掉line的左右两边空格;后用split()函数分割 (以’\\t’为分隔符进行分割,返回值类型是list) ,用tokens接收分割后的一个结果,如果长度不为4,证明该处出现问题,continue
  4. 切分完成后,用字典student接收tokens的每个元素,最后读取到列表students中
def load():# 读档# 如果文件不存在,直接返回,不再读档if not os.path.exists('data.txt'):return# 读档前保证students中没有数据global studentsstudents = []with open('data.txt', 'r', encoding='utf8') as f:for line in f:  # 每次切分f的一个学生数据line.strip()    # 去掉字符串两边的空格tokens = line.split('\\t')   # 以'\\t'为分隔符分割line - 返回值是list(列表)if len(tokens) != 4:print(f"当前行格式有问题: line={line}")continue# 此时切分完成student = {'studentId' : tokens[0],'name' : tokens[1],'gender' : tokens[2],'className' : tokens[3]}# 将元素读取到students中students.append(student)print(f"[读取数据成功] 共读取了 {len(students)} 条数据")

完整代码

import os.path
import sysdef menu():print("---------------------------------------------------")print("1. 新增学生")print("2. 显示学生")print("3. 查找学生")print("4. 删除学生")print("0. 退出系统")print("---------------------------------------------------")choice = input("请输入选择: ")return choice# 用一个全局变量存学生信息
# 该全局变量为列表,列表中每个元素都是字典,字典中存放一个学生的所有信息
students = []def save():# 存储学生信息with open('data.txt','w',encoding='utf8') as f:for s in students:f.write(f"{s['studentId']}\\t{s['name']}\\t{s['gender']}\\t{s['className']}")print(f'[存储数据成功] 共存储了 {len(students)} 条数据')def load():# 读档# 如果文件不存在,直接返回,不再读档if not os.path.exists('data.txt'):return# 读档前保证students中没有数据global studentsstudents = []with open('data.txt', 'r', encoding='utf8') as f:for line in f:  # 每次切分f的一行(一个学生数据)line.strip()    # 去掉字符串两边的空格tokens = line.split('\\t')   # 以'\\t'为分隔符分割line - 返回值是list(列表)if len(tokens) != 4:print(f"当前行格式有问题: line={line}")continue# 此时切分完成student = {'studentId' : tokens[0],'name' : tokens[1],'gender' : tokens[2],'className' : tokens[3]}# 将元素读取到students中students.append(student)print(f"[读取数据成功] 共读取了 {len(students)} 条数据")
def Add():print("[新增学生]: 开始")# 学号studentId = input("输入学号: ")# 姓名name = input("输入姓名: ")# 性别gender = input("输入性别: ")# 判断性别是否有误# if(gender not in('男', '女')):#     print("输入性别不符合要求: 新增学生失败")#     return# 班级className = input("输入班级: ")# 用字典将学生信息聚合student = {'studentId' : studentId,'name' : name,'gender' : gender,'className' : className}global studentsstudents.append(student)    #将该学生写入列表中# 保存学生信息save()print("[新增学生]: 完成")def Display():print("[显示学生]: 开始")for s in students:print(f"[{s['studentId']}]\\t{s['name']}\\t{s['gender']}\\t{s['className']}")print(f'[显示学生] 完成:  共显示了 {len(students)} 条数据!')def Find():print("[查找学生]: 开始")name = input("请输入要查找的学生姓名: ")count = 0   # 记录查找到的学生总数for s in students:if name == s['name']:print(f"[{s['studentId']}]\\t{s['name']}\\t{s['gender']}\\t{s['className']}")count += 1print(f"[查找学生]: 完成\\t共查找到{count}个匹配的学生")def Delete():print("[删除学生]:开始")studentId = input("输入要删除的学生的学号: ")for s in students:if(studentId == s['studentId']):print(f"删除了学生{s['name']}")students.remove(s)  #列表调用remove进行删除# 保存此时数据save()print("[删除学生]:完成")def main():# 入口函数(主函数)# 通过控制台交互print("---------------------------------------------------")print("                    学生管理系统                     ")print("---------------------------------------------------")# 开始前先调用load,读取数据load()while True:# menu() 菜单choice = menu()if choice == '1':Add()elif choice == '2':Display()elif choice == '3':Find()elif choice == '4':Delete()elif choice == '0':print("学生管理系统: 退出成功!")sys.exit(0)else:print("输入有误, 重新输入")main()