学生管理系统 Python

'''文件修改周期及修改人
start: 2020_02_03_09_51
end:2020_02_04_18_39
modify
赖汉栋
'''

'''功能模块
1、添加学生及成绩信息
2、将学生信息保存到文件中
3、修改和删除学生信息
4、查询学生信息
5、根据学生成绩进行排序
6、统计学生的总分
7、显示全部学生信息
'''

'''主函数main说明
main函数主要用于实现系统的主界面,
menu函数生成功能选择菜单,
并且用if语句控制子函数调用。
'''

import os
import re

def menu():                                     # menu()函数主体
    #输出菜单
    print('''
    ┌-------学生信息管理系统-------┐
     ▏                              ▏
     ▏                              ▏
     ▏   ======功能菜单======       ▏
     ▏                              ▏
     ▏   1 录入学生信息             ▏
     ▏   2 查找学生信息             ▏
     ▏   3 删除学生信息             ▏
     ▏   4 修改学生信息             ▏
     ▏   5 排序                     ▏
     ▏   6 统计学生总人数           ▏
     ▏   7 显示所有学生信息         ▏
     ▏   0 退出系统                 ▏
     ▏   ====================       ▏
     ▏   说明:通过数字键选择菜单   ▏
     ▏                              ▏
    └------------------------------┘
    ''')

def save(student):                              # save()函数主体
    # 将学生信息保存到文件
    try:
        students_txt = open("studentsInfo.txt", "a")# 以追加模式打开
    except Exception as e:
        students_txt = open("studentsInfo.txt", "w")# 文件不存在,创建文件并打开
    # 用try...except语句捕获异常
    for info in student:
        students_txt.write(str(info) + "\n")    # 按行存储,添加换行符
    students_txt.close()                        # 关键文件


def insert():
    studentList = []                            # 保存学生信息的列表
    mark = True                                 # 是否继续添加
    while mark:
        id = input("请输入ID(如1001):")
        if not id:                              # ID为空,跳出循环
            break
        name = input("请输入名字:")
        if not name:                            # 名字为空,跳出循环
            break
        try:
            english = int(input("请输入英语成绩:"))
            python = int(input("请输入Python成绩:"))
            c = int(input("请输入C语言成绩:"))
        except:
            print("输入无效,不是整型数值.....请重新输入")
            continue
        # 将输入的学生信息保存到字典
        student = {"id":id, "name":name, "english":english, "python":python, "c":c}
        studentList.append(student)             # 将学生字典添加到列表中
        inputMark = input("是否继续添加?(y/n):")
        if inputMark == "y":                    # 继续添加
            mark = True
        else:                                   # 不继续添加
            mark = False
    save(studentList)                           # 将学生信息保存到文件
    print("学生信息录入完毕!")
    

def delete():                                   # delete()函数主体
    # 删除学生信息
    mark = True                                 # 标记是否循环
    while mark:
        studentId = input("请输入要删除的学生ID:")
        if studentId is not "":                 # 判断是否输入要删除的学生
            if os.path.exists("studentsInfo.txt"):# 判断文件是否存在  +
                with open("studentsInfo.txt", 'r') as rfile:# 打开文件
                    student_old = rfile.readlines()# 读取全部内容
            else:
                student_old = []
            ifdel = False                       # 标记是否删除
            if student_old:                     # 如果存在学生信息
                with open("studentsInfo.txt", 'w') as wfile:# 以写方式打开文件
                    d = {}                      # 定义空字典
                    for list in student_old:
                        d = dict(eval(list))    # 字符串转字典
                        if d['id'] != studentId:
                            wfile.write(str(d) + "\n")# 将一条学生信息写入文件+
                        else:
                            ifdel = True        # 标记已经删除
                    if ifdel:
                        print("ID为%s的学生信息已经被删除..."% studentId)
                    else:
                        print("没有找到ID为%s的学生信息..."% studentId)
            else:                               # 不存在学生信息
                print("无学生信息...")
                break                           # 退出循环
            show()                              # 显示全部学生信息
            inputMark = input("是否继续删除?(y/n):")
            if inputMark == "y":
                mark = True                     # 继续删除
            else:
                mark = False                    # 退出删除学生信息功能 
    


def modify():                                   # modify()函数主体
    # 修改学生信息
    show()                                      # 显示全部学生信息
    if os.path.exists("studentsInfo.txt"):      # 判断文件是否存在
        with open("studentsInfo.txt", 'r') as rfile:# 打开文件
            student_old = rfile.readlines()     # 读取全部内容
    else:
        return
    studentId = input("请输入要修改的学生ID:")
    with open("studentsInfo.txt", "w") as wfile:# 以只写模式打开文件
        for student in student_old:
            d = dict(eval(student))             # 字符串转字典                +
            if d['id'] == studentId:            # 是否为要修改的学生
                print("找到了这名学生,可以修改该同学的信息!")
                while True:                     # 输入要修改的信息
                    try:
                        d["name"] = input("请输入姓名:")
                        d["english"] = int(input("请输入英语成绩:"))
                        d["python"] = int(input("请输入Python成绩:"))
                        d["c"] = int(input("请输入C语言成绩:"))
                    except:
                        print("您的输入有误,请重新输入...")
                    else:
                        break                   # 跳出循环
                student = str(d)                # 将字典转换为字符串
                wfile.write(student + "\n")     # 将修改的信息写入到文件
                print("修改成功!")
            else:
                wfile.write(student)            # 将未修改的信息写入到文件
        mark = input("是否继续修改其他学生的学生信息?(y/n):")
        if mark == "y":
            modify()                            # 重新执行修改操作
            

def show_student(studentList):                  # show_student()函数主体
    if not studentList:                         # 如果没有要显示的数据
        print("@.@ 无数据信息 @.@")
        return
    # 定义标题显示格式
    format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"#    +
    print(format_title.format("ID", "名字", "英语成绩", " Python成绩",
                              "C语言成绩", "总成绩"))# 按指定格式显示标题
    # 定义具体内容显示格式
    format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
    for info in studentList:                    # 通过for循环将列表中的数据全部显示出来
        print(format_data.format(info.get("id"),
                                 info.get("name"),
                                str(info.get("english")),
                                str(info.get("python")),
                                str(info.get("c")),
                                str(info.get("english") +
                                    info.get("python") +
                                    info.get("c")).center(12)))#        +
            


def search():                                   # search()函数主体
    # 查询学生信息
    mark = True
    student_query = []                          # 保存查询结果的学生信息
    while mark:
        id = ""
        name = ""
        if os.path.exists("studentsInfo.txt"):  # 判断文件是否存在
            mode = input("按ID查输入1;按姓名查输入2:")
            if mode == "1":                     # 按学生编号查询
                id = input("请输入学生ID:")
            elif mode == "2":                   # 按学生姓名查询
                name = input("请输入学生姓名:")
            else:
                print("您的输入有误,请重新输入!")
                search()                        # 重新查询              +
            with open("studentsInfo.txt", 'r') as file:# 打开文件
                student = file.readlines()      # 读取全部内容
                for list in student:
                    d = dict(eval(list))        # 字符串转字典            +
                    if id is not "":            # 判断是否按ID查询
                        if d['id'] == id:
                            student_query.append(d)# 将找到的学生信息保存到列表中
                    elif name is not "":        # 判断是否按姓名查询
                        if d['name'] == name:
                            student_query.append(d)# 将找到的学生信息保存到列表中
                show_student(student_query)     # 显示查询结果
                student_query.clear()           # 清空列表
                inputMark = input("是否继续查询?(y/n):")
                if inputMark == "y":
                    mark = True
                else:
                    mark = False
        else:
            print("暂未保存数据信息...")
            return
                    

def total():                                    # total()函数主体
    if os.path.exists("studentsInfo.txt"):
        with open("studentsInfo.txt", 'r') as rfile:# 打开文件
            student_old = rfile.readlines()     # 读取全部内容
            if student_old:
                print("一共有 %d 名学生!" % len(student_old))# 统计学生人数
            else:
                print("还没有录入学生信息...")
    else:
        print("暂未保存数据信息..")


def show():                                     # show()函数主体
    student_new = []
    if os.path.exists("studentsInfo.txt"):      # 判断文件是否存在      +
        with open("studentsInfo.txt", 'r') as rfile:# 打开文件
            student_old = rfile.readlines()     # 读取全部内容
        for list in student_old:
            student_new.append(eval(list))      # 将找到的学生信息保存到列表中
        if student_new:
            show_student(student_new)
    else:
        print("暂未保存数据信息...")



def sort():                                     # sort()函数主体
    show()
    if os.path.exists("studentsInfo.txt"):      # 判断文件是否存在
        with open("studentsInfo.txt", 'r') as file:# 以只读模式打开文件
            student_old = file.readlines()      # 读取全部内容
            student_new = []
        for list in student_old:
            d = dict(eval(list))                # 字符串转字典
            student_new.append(d)               # 将转换后的字典添加到列表中
    else:
        return
    ascORdesc = input("请选择(0升序;1降序):")
    if ascORdesc == "0":                        # 按升序排序
        ascORdescBool = False
    elif ascORdesc == "1":                      # 按降序排序
        ascORdescBool = True
    else:
        print("您的输入有误,请重新输入!")
        sort()
    mode = input("请选择排序方式(1按英语成绩排序;2按Python成绩排序;3按C语言成绩排序;0按总成绩排序):")
    if mode == "1":                             # 按英语成绩排序           +
        student_new.sort(key=lambda x: x["english"], reverse = ascORdescBool)
    elif mode == "2":                           # 按Python成绩排序
        student_new.sort(key=lambda x: x["python"], reverse = ascORdescBool)
    elif mode == "3":                           # 按C成绩排序
        student_new.sort(key=lambda x: x["c"], reverse = ascORdescBool)
    elif mode == "0":                           # 按总成绩排序
        student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse = ascORdescBool)
    else:
        print("您的输入有误,请重新输入!")
        sort()
    show_student(student_new)                   # 显示排序结果 


def main():
    ctrl = True                                 # 标记是否退出系统
    while(ctrl):                                # 显示菜单
        menu()
        option = input("请选择:")              # 选择菜单项
        #option_str = re.sub("\D", "", option)   # 提取数字                    + 
        option_str = option
        if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
            option_int = int(option_str)
            if option_int == 0:                 # 退出系统
                print('您已退出学生信息管理系统!')
                ctrl = False
            elif option_int == 1:               # 录入学生成绩信息
                insert()
            elif option_int == 2:               # 查找学生成绩信息
                search()
            elif option_int == 3:               # 删除学生成绩信息
                delete()
            elif option_int == 4:               # 修改学生成绩信息
                modify()
            elif option_int == 5:               # 排序
                sort()
            elif option_int == 6:               # 统计学生总数
                total()
            elif option_int == 7:               # 显示所有学生信息
                show()

main()

                

1. 温 故

1.1 文件使用(见PDF)

D:\A_learning\Python learning\《Python语言程序设计基础》_电子版_附代码_嵩天\第七章Python文件和数据格式化\7.1-文件的使用.pdf

1.2 print(“%s”% x)

说明:x 为字符串变量名

1.3字符串转字典
student_old = rfile.readlines()     # 读取全部内容
for student in student_old:
    d = dict(eval(student)) # student为字符串名,按行读入的字符串里的元素

2. 知 新

2.1 判断文件是否存在
if os.path.exists("studentsInfo.txt"): 
2.2 with的用法

With语句的基本语法格式:

with expression [as target]:

with_body

参数说明:

expression:是一个需要执行的表达式;

target:是一个变量或者元组,存储的是expression表达式执行返回的结果,可选参数。

if os.path.exists("studentsInfo.txt"):          # 判断文件是否存在
    with open("studentsInfo.txt", 'r') as rfile:# 打开文件
        student_old = rfile.readlines()         # 读取全部内容
2.3 字符串输出格式化的方法

转载博客

2.4 重新调用函数解决用户错误输入
def search():                                   # search()函数主体
    # 查询学生信息
    mark = True
    student_query = []                          # 保存查询结果的学生信息
    while mark:
        id = ""
        name = ""
        if os.path.exists("studentsInfo.txt"):  # 判断文件是否存在
            mode = input("按ID查输入1;按姓名查输入2:")
            if mode == "1":                     # 按学生编号查询
                id = input("请输入学生ID:")
            elif mode == "2":                   # 按学生姓名查询
                name = input("请输入学生姓名:")
            else:
                print("您的输入有误,请重新输入!")
                search()                        # 重新查询              
            # 以下省略(最后一行为处理方法)

思考:应该不适用C\C++,这里是返回函数第一行重新调用,而C语言就是递归,然后跳出再执行上一层?

2.5 列表元素排序方法

不错的博客–转载

2.6 python的正则表达式字符串替换 re.sub

详细!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值