学生管理系统(Python实现)

学生管理系统介绍

学生管理系统是为了对学校学生信息进行管理而开发的一款软件,下面我们来实现一个命令行版本的学生管理系统,该学生管理系统包括如下几个功能:

  • 新增学生信息
  • 显示学生信息
  • 查找学生信息
  • 删除学生信息
  • 学生信息存档

学生管理系统效果展示

在这里插入图片描述

代码实现

入口函数

在程序与用户进行交互之前,先调用load函数进行读档,将学生信息加载到程序中来,然后通过menu函数与用户进行交互。

  • 如果用户输入的数字为1,则进行新增学生信息操作。
  • 如果用户输入的数字为2,则进行显示学生信息操作。
  • 如果用户输入的数字为3,则进行查找学生信息操作。
  • 如果用户输入的数字为4,则进行删除学生信息操作。
  • 如果用户输入的数字为5,则进行学生信息存档操作。
  • 如果用户输入的数字为0,则退出学生信息管理系统。

如果用户的输入不包含在上述情况中,则提示用户输入有误,本次交互结束,进入下一次交互。

代码如下:

# 入口函数
def main():
    load()  # 先进行读档
    while True:
        # 打印菜单
        choice = menu()
        if choice == '1':
            # 新增学生信息
            insert()
        elif choice == '2':
            # 显示学生信息
            show()
        elif choice == '3':
            # 查找学生信息
            find()
        elif choice == '4':
            # 删除学生信息
            delete()
        elif choice == '5':
            # 学生信息存档
            save()
        elif choice == '0':
            # 退出程序
            print('goodbye!')
            sys.exit(0)
        else:
            print('您的输入有误!')

        x = input('按下任意按键继续操作...')
        os.system('cls')  # 清空控制台输出

说明一下:

  • 每次交互前可以将上次的交互信息清空,为了避免清空太快导致用户没来得及读取信息,可以提示用户按下任意键后再进入下一次交互。
  • system是os模块中的一个函数,该函数可以将字符串转换成命令在服务器上运行,而清空控制台输出的命令便是cls
  • exit是sys模块中的一个函数,该函数的作用是直接让当前程序退出,其参数代表的是程序退出时的退出码。

打印菜单

打印菜单函数将学生管理系统提供的服务进行输出,以供用户选择,并把用户的选择结果返回。

代码如下:

# 打印菜单
def menu():
    print('         >>欢迎来到学生管理系统<<         ')
    print('         |   1.新增学生信息   |         ')
    print('         |   2.显示学生信息   |         ')
    print('         |   3.查找学生信息   |         ')
    print('         |   4.删除学生信息   |         ')
    print('         |   5.学生信息存档   |         ')
    print('         |   0.退出管理系统   |         ')
    choice = input('请输入你的选择: ')
    return choice

新增学生信息

管理学生信息

我们当前实现的这个学生管理系统使用一个字典来管理所有学生的信息,该字典中的键key是学生的学号,字典中每个键对应的值value就是该学生的各项信息,包括学生的姓名、性别和班级。

比如:

students = {
    
    
    '202021150201': {
    
    'name': '张三', 
                     'gender': '男', 
                     'className': '2'},
    '202021150304': {
    
    'name': '李四',
                     'gender': '女',
                     'className': '3'},
}

因此在程序中需要先定义一个空字典,后续对学生信息进行的增删查操作本质上就是对这个字典的增删查操作。

# 使用字典来管理所有的学生信息
students = {
    
    }

新增学生信息

新增学生信息函数的作用是将学生信息添加到学生管理系统中,该函数要求用户输入一个学生的信息,并判断输入信息的合法性,如果合法则将该学生的信息插入到全局字典students中。

代码如下:

# 新增
def insert():
    print('[新增学生] 开始!')
    studentId = input('请输入学生的学号: ')
    name = input('请输入学生的姓名: ')
    gender = input('请输入学生的性别: ')
    if gender not in ('男', '女'):
        print('性别输入有误,新增失败!')
        return
    className = input('请输入学生的班级: ')
    # 使用字典将上述信息聚合起来
    studentInfo = {
    
    
        'name': name,
        'gender': gender,
        'className': className
    }
    if studentId in students:
        choice = input('已存在该学号的同学,是否对其信息进行覆盖(是/否): ')
        if choice == '否':
            return
    # 将该学生信息插入到students中
    students[studentId] = studentInfo
    print('[新增学生] 完毕!')

说明一下:

  • 由于全局字典students是以学号作为键值的,因此在新增学生信息之前,需要先判断待新增学生的学号是否已经存在于字典中。
  • 如果已经待新增学生的学号已经存在,则提示用户是否对其信息进行覆盖,如果是则修改该学号对应的学生信息,否则停止本次新增操作。

显示学生信息

显示学生信息

显示学生信息函数要做的就是遍历全局字典students,将字典中各个学生的信息进行打印输出即可。

代码如下:

# 显示
def show():
    print('[显示学生] 开始!')
    # 遍历全局字典students,把所有学生的信息打印出来
    for sId in students:
        sInfo = students[sId]  # 学号为sId的同学的信息
        print(f"{
      
      sId}\t{
      
      sInfo['name']}\t{
      
      sInfo['gender']}\t{
      
      sInfo['className']}")
    print(f'[显示学生] 完毕! 共显示了 {
      
      len(students)} 条数据!')

查找学生信息

查找学生信息

查找学生信息函数的作用是根据学号查找对应学生的信息,该函数要求用户输入待查找学生的学号,然后在全局字典students中进行查找,如果找到了则将该学生的信息进行输出。

代码如下:

# 查找
def find():
    print('[查找学生] 开始!')
    studentId = input('请输入要查找的同学学号: ')
    flag = False  # 记录是否找到该学号的同学
    for sId in students:
        if sId == studentId:
            sInfo = students[sId]  # 学号为sId的同学的信息
            print(f"[{
      
      sId}\t{
      
      sInfo['name']}\t{
      
      sInfo['gender']}\t{
      
      sInfo['className']}]")
            flag = True  # 找到了
            break
    if not flag:
        print('没有找到该学号的同学!')
    print(f'[查找学生] 完毕!')

删除学生信息

删除学生信息

删除学生信息函数的作用是根据学号删除对应学生的信息,该函数要求用户输入待删除学生的学号,然后遍历全局字典students将该学号的学生从字典中删除即可。

代码如下:

# 删除
def delete():
    print('[删除学生] 开始!')
    studentId = input('请输入要删除的学生学号: ')
    for sId in list(students.keys()):
        if sId == studentId:
            sInfo = students[sId]  # 学号为sId的同学的信息
            print(f"删除 {
      
      sInfo['name']} 同学的信息!")
            students.pop(sId)  # 将该学生信息从students中删除
    print('[删除学生] 完毕!')

说明一下:

  • 在使用for循环遍历字典的过程中,不能对字典进行插入或删除操作,因为在迭代过程中修改字典结构会导致迭代器失效。
  • 因此上述代码没有选择直接对字典进行迭代,而是先通过字典的keys方法获取到字典中所有key组成的列表(该列表的类型是dict_keys),然后将该列表强制类型转换成list类型后,对该list列表进行的迭代操作。

实现存档读档

约定存档读档格式

在编写存档读档函数之前,需要先约定一下存档的格式,保证存档和读档的方式是一致的。

这里做出如下约定:

  • 存档文件命名为record.txt,与Python程序存储在同级目录下。
  • 存档文件以行文本的方式保存学生信息,即每一行表示一个学生的信息。
  • 每个学生的各项信息之间使用制表符\t进行分隔。

存档

存档时遍历全局字典students中的各个键值对,将每个学生的各项信息使用制表符\t分隔后再写入存档文件中。

代码如下:

# 存档
def save():
    with open('record.txt', 'w', encoding='utf8') as f:
        for sId in students:
            sInfo = students[sId]  # 学号为sId的同学的信息
            f.write(f"{
      
      sId}\t{
      
      sInfo['name']}\t{
      
      sInfo['gender']}\t{
      
      sInfo['className']}\n")
        print(f'[存档完毕] 共存储了 {
      
      len(students)} 条记录!')

读档

读档的步骤如下:

  • 先将全局字典students中的数据清空,以供读档使用。
  • 按行对存档文件进行遍历,依次获取到每个学生的信息。
  • 将各个同学的信息依次插入到全局字典students中。

其中,对于读取到的每行数据的处理步骤如下:

  • 先通过字符串的strip方法去掉字符串首尾的空白符(包括\n\r\t)。
  • 然后通过字符串的split方法将字符串以\t作为分隔符进行分隔,得到该行同学对应的各项信息。
  • 接着将该同学的姓名、性别和班级聚合到一个字典中。
  • 最后以该同学的学号作为键值key,以这个聚合出来的字典作为值value,插入到全局字典students中。

代码如下:

# 读档
def load():
    # 如果存档文件不存在则直接跳过读档流程(避免导致异常)
    if not os.path.exists('record.txt'):
        return
    # 读档之前把旧的数据清理干净
    global students
    students = {
    
    }
    with open('record.txt', 'r', encoding='utf8') as f:
        for line in f:
            line = line.strip()  # 去掉字符串首位的空白符(\n,\r,\t)
            tokens = line.split('\t')  # 对每一行数据进行切分,以\t作为分隔符
            if len(tokens) != 4:
                print(f'当前行格式存在问题! line = {
      
      line}')
                continue
            studentId = tokens[0]
            studentInfo = {
    
    
                'name': tokens[1],
                'gender': tokens[2],
                'className': tokens[3]
            }
            # 将该行学生信息插入到students中
            students[studentId] = studentInfo
        print(f'[读档完毕] 共读取了 {
      
      len(students)} 条记录!')

打包成exe程序

打包成exe程序

执行以下命令即可将刚才编写的Python程序打包成exe程序。

pyinstaller -F -i logo.ico 学生管理系统.py

说明一下:

  • 生成后的exe程序的图标将会被修改为logo.ico,这个图标文件需要与Python程序放在同级目录下。

此时在学生管理系统.py的同级目录下会生成一个dict目录,生成的exe程序就在该目录中。如下:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/chenlong_cxy/article/details/127585306