python之學生信息管理系統(控制檯程序)

一、文件夾結構

在這裏插入圖片描述

二、相關說明

1、系統開發環境

windows10系統,python3.6,開放工具ptcharm2018

2、相關庫

python內置模塊os和re

三、系統功能結構

包括6大模塊
錄入學生信息模塊、刪除學生模塊,修改學生模塊,查找學生模塊,排序學生模塊,查詢、統計學生模塊。

四、相關代碼

# _*_ coding:utf-8   _*_
import re, os
def main():
    ctrl = True   # 標記是否退出系統
    while(ctrl):
        menu()    # 顯示菜單
        option = input("請選擇")   # 選擇菜單項
        option_str = re.sub("\D", "", 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()


def menu():
    # 輸出菜單
    print('''
    ╔———————學生信息管理系統————————╗
    │                                              │
    │   =============== 功能菜單 ===============   │
    │                                              │
    │   1 錄入學生信息                             │
    │   2 查找學生信息                             │
    │   3 刪除學生信息                             │
    │   4 修改學生信息                             │
    │   5 排序                                     │
    │   6 統計學生總人數                           │
    │   7 顯示所有學生信息                         │
    │   0 退出系統                                 │
    │  ==========================================  │
    │  說明:通過數字或↑↓方向鍵選擇菜單          │
    ╚———————————————————————╝
    ''')


def save(student):
    try:
        student_txt = open('student.txt', "a")   # 追加模式打開
    except Exception as e:
        student_txt = open('student.txt',"w")    # 文件不存在,創建文件打開
    for info in student:
        student_txt.write(str(info) + "\n")     # 按行存儲,添加換行符
    student_txt.close()


def insert():
    studentList = [] # 添加保存學生信息的列表
    mark = True      # 是否繼續
    while mark:
        id = input("請輸入IP(如317XXXXX1):")
        if not id:    # ID爲空,跳出循環
            break
        name = input("請輸入名字")
        if not name:   # 名字爲空,跳出循環
            break
        try:
            iep = float(input("請輸入智育分"))
            mep = float(input("請輸入德育分"))
            sp = float(input("請輸入文體分"))
        except:
            print("輸入無效,請重新輸入")
            continue
        # 請將輸入的學生信息保存到字典
        student = {"id":id, "name":name, "iep":iep, "mep":mep, "sp":sp}
        studentList.append(student)  # 將學生字典添加到列表中
        inputMark = input("是否繼續添加,(y/n):")
        if inputMark == "y":
            mark = True     # 繼續添加
        else:
            mark = False    # 不繼續添加

        save(studentList)   # 將學生信息保存到文件裏
        print("學生信息錄入完畢")


def delete():
    mark = True   # 標記是否循環
    while mark:
        studentId = input("請輸入要刪除的學生ID:")
        if studentId is not "":                     # 判斷輸入是否要刪除的學生
            if os.path.exists("student.txt"):    # 判斷文件是否存在
                with open("student.txt", 'r') as rfile:  # 打開文件
                    student_old = rfile.readlines() # 讀取全部內容
            else:
                student_old = []
            ifdel = False
            if student_old:       #標記是否刪除
                with open('student.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():
    show()
    if os.path.exists("student.txt"):   # 判斷文件是否存在
        with open("student.txt", 'r') as rfile:
            student_old = rfile.readlines()   # 讀取全部文件內容
    else:
        return
    studentid = input("請輸入要修改的學生的ID:")
    with open("student.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['iep'] = float(input("請輸入智育分"))
                        d['mep'] = float(input("請輸入德育分"))
                        d['sp'] = float(input("請輸入文體分"))
                    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 search():
    mark = True
    student_query = []   # 用於保存查詢結果的時間的列表
    while mark:
        id = ""
        name = ""
        if os.path.exists("student.txt"):
            mode = input("按ID查詢請輸入1, 按名字查詢請輸入2:")
            if mode == '1':
                id = input("請輸入學生ID")
            elif mode == '2':
                name = input("請輸入學生名字")
            else:
                print("你的輸入有誤,請重新輸入!")
                search()                           # 重新查詢
            with open("student.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 show_student(studentList):
    if not studentList:
        print("無相關數據")
        return
    # 定義標題格式
    format_title = "{:^12}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
    # 按指定格式顯示標題
    print(format_title.format("ID", "名字", "智育分", "德育分", "文體分", "總分"))
    # 定義具體內容格式
    format_data = "{:^12}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
    for info in studentList:
        print(format_data.format(info.get("id"),
                                 info.get("name"),
                                 str(info.get("iep")),
                                 str(info.get("mep")),
                                 str(info.get("sp")),
                                 str(info.get("iep")*0.7+info.get("mep")*0.2+info.get("sp")*0.1).center(12)))



def total():
    if os.path.exists("student.txt"):
        with open("student.txt", 'r') as rfile:
            student_old = rfile.readlines()
            if student_old:
                print("一共有 %d 名學生!" % len(student_old))
            else:
                print("還沒有錄入學生信息!")
    else:
        print("暫未保存數據信息。。。")


def show():
    student_new = []
    if os.path.exists("student.txt"):
        with open("student.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():
    show()
    if os.path.exists("student.txt"):
        with open("student.txt", 'r') as rfile:
            student_old = rfile.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按德育分排序;3按文體分排序;0按總分排序):")
    if mode == '1':
        student_new.sort(key=lambda x: x["iep"], reverse=ascORdescBool)
    elif mode == '2':
        student_new.sort(key=lambda x: x["mep"], reverse=ascORdescBool)
    elif mode == '3':
        student_new.sort(key=lambda x: x["sp"], reverse=ascORdescBool)
    elif mode == '0':
        student_new.sort(key=lambda x: x["iep"]*0.7+x["mep"]*0.2+x["sp"]*0.1, reverse=ascORdescBool)
    else:
        print("你的輸入有誤,請重新輸入!")
        sort()
    show_student(student_new)


if __name__ == "__main__":
    main()

五、說明

項目的核心是對文件、字典、列表的操作。當然還有很多不足,有想法的歡迎的評論區提出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章