Python實現(xiàn)一個完整學(xué)生管理系統(tǒng)
前言
功能
- 新增學(xué)生
- 顯示學(xué)生
- 查找學(xué)生
- 刪除學(xué)生
- 存到文檔
創(chuàng)建入口函數(shù)
在入口函數(shù)中,可以先打印一個菜單,用菜單來進行交互。
def menu(): print('1.新增學(xué)生') print('2.顯示學(xué)生') print('3.查找學(xué)生') print('4.刪除學(xué)生') print('0.退出程序')
光有菜單也不行,因為輸入的數(shù)字要對應(yīng)菜單上的選項。所以可以在菜單里搞一個輸入和返回值,把輸入的值給返回,用一個變量接收。
def menu(): print('1.新增學(xué)生') print('2.顯示學(xué)生') print('3.查找學(xué)生') print('4.刪除學(xué)生') print('0.退出程序') choice = input('請輸入您的選擇:') return choice
在根據(jù)菜單里的選項對應(yīng)一下需要實現(xiàn)的內(nèi)容。
這里可以用if-else-elif
語句來完成。
ret = menu() if ret == '1': #新增學(xué)生 insert() elif ret == '2': #顯示學(xué)生 show() elif ret == '3': #查找學(xué)生 find() elif ret == '4': #刪除學(xué)生 del() elif ret == '0': #退出程序 print('bye bye') sys.exit(0) else: print("輸入錯誤,請重新輸入")
在調(diào)整學(xué)生信息的時候,肯定需要進行多次更改,所以,要把上面的代碼放在循環(huán)里,當(dāng)用戶用完之后,輸入指定的數(shù)字或其他東西,才能退出。輸入錯誤的時候,要讓用戶重新輸入。
while True: #通過menu函數(shù)來打印除菜單 ret = menu() if ret == '1': #新增學(xué)生 insert() elif ret == '2': #顯示學(xué)生 show() elif ret == '3': #查找學(xué)生 find() elif ret == '4': #刪除學(xué)生 delete() elif ret == '0': #退出程序 print('bye bye') sys.exit(0) else: print("輸入錯誤,請重新輸入") #進入下次循環(huán),讓用戶重新輸入 continue
這樣,學(xué)生管理系統(tǒng)的大致框架。接下來把對應(yīng)選項的函數(shù)實現(xiàn)即可。
做完框架的時候,可以考慮運行一下試試。
新增學(xué)生insert
要新增學(xué)生,就要先輸入學(xué)生的基本信息,在這里,可以弄一個全局變量的列表,和一個局部變量的字典,為什么呢?因為用字典,可以把學(xué)生的所有信息都存在里面,然后列表的每一個元素都是字典,每一個字典就是一個學(xué)生。
def insert(): StuId = input('請輸入學(xué)生的學(xué)號:') StuName = input('請輸入學(xué)生的姓名:') StuGender = input('請輸入學(xué)生的性別:') if StuGender not in ('男','女'): print('性別輸入不符合的內(nèi)容不符合要求') return StuClass = input('請輸入學(xué)生的班級:') #使用一個字典把上述信息給聚合起來 StuDict = { 'StuId':StuId, 'StuName':StuName, 'StuGender':StuGender, 'StuClass':StuClass } global StuList StuList.append(StuDict) print('新增學(xué)生完畢')
這里,并不能看出新增的學(xué)生是否在列表里面,下面來實現(xiàn)show
展示學(xué)生的函數(shù)。
展示學(xué)生show
展示學(xué)生只需要把學(xué)生遍歷即可
def show(): #遍歷全局變量的這個列表,把每個學(xué)生的信息給打印出來。 print(f'[{["StuId"]}]\t{["StuName"]}\t{["StuGender"]}\t{["StuClass"]}') for stu in StuList: print(f'[{stu["StuId"]}]\t\t\t{stu["StuName"]}\t\t\t{stu["StuGender"]}\t\t\t\t{stu["StuClass"]}') print(f'顯示學(xué)生完畢!共有{len(StuList)}個學(xué)生')
因為變量是存在內(nèi)存中的,當(dāng)程序結(jié)束,內(nèi)存中的數(shù)據(jù)便會被銷毀,所以每次運行程序都需要重新輸入信息。
為了解決這個問題,一會我會把數(shù)據(jù)存儲在文件里。
查找學(xué)生find
查找學(xué)生的功能,在這里,以名字查找為例。
先輸入學(xué)生的名字,然后開始遍歷全局變量StuList
看是否有相匹配的同學(xué),若有:則打印出匹配同學(xué)的信息,若無:則繼續(xù)遍歷,直到遍歷完畢,flag依舊為False
,就輸出沒有找到與該姓名相匹配的同學(xué)。
def find(): name = input('請輸入要查找的同學(xué)的姓名') cnt = 0 flag = False print(f'[{["StuId"]}]\t{["StuName"]}\t{["StuGender"]}\t{["StuClass"]}') for stu in StuList: if name == stu['StuName']: print(f'[{stu["StuId"]}]\t\t\t{stu["StuName"]}\t\t\t{stu["StuGender"]}\t\t\t\t{stu["StuClass"]}') cnt += 1 flag = True if not flag: print(f'沒有找到與該姓名相匹配的同學(xué)') print(f'查找到了{cnt}個匹配的同學(xué)')
刪除學(xué)生delete
根據(jù)姓名刪除學(xué)生與根據(jù)姓名查找學(xué)生類似,先把該學(xué)生的姓名輸入,然后對全局變量進行遍歷即可
def delete(): name = input('請輸入要刪除學(xué)生的姓名') flag = False #看看這個要函數(shù)學(xué)生的姓名對應(yīng)列表中的哪個元素,把這個元素刪除了就好 for stu in StuList: if name == stu['StuName']: StuList.remove(stu) flag = True if not flag: print('沒有找到該學(xué)生,請重新查找') res = input('若不進行刪除,則輸入1,退出刪除程序,輸入其他則重新刪除學(xué)生') if res == '1': pass else: delete() #刪除之后學(xué)生的人數(shù)為 print(f'刪除之后學(xué)生的人數(shù)為{len(StuList)}')
加入存檔讀檔
約定文件放到D:/FileOperator/Stu.txt文件中
并且以行文本的方式來保存學(xué)生信息 學(xué)號\t名字\t性別\t班級 學(xué)號\t名字\t性別\t班級 學(xué)號\t名字\t性別\t班級 每個同學(xué)占一行. 每個同學(xué)的信息之間使用 \t 制表符進行分隔
存檔
存檔就是把學(xué)生內(nèi)容,添加到一個文件里,這個操作就是一個遍歷,每次把學(xué)生加入即可。
def save(): """ 用于存檔 """ with open('d:/FileOperator/Stu.txt','w',encoding = 'UTF8') as f: for s in StuList: f.write(f"{s['StuId']}\t{s['StuName']}\t{s['StuGender']}\t{s['StuClass']}\n") print(f'存檔成功,共存儲了{len(StuList)}個記錄')
但是光有存檔,每次運行的時候,展示學(xué)生,還是沒有之前添加學(xué)生的記錄,這是因為,添加的學(xué)生在文件里,沒有寫入讀入內(nèi)存。
讀檔
strip方法可以去掉一個字符串開頭和末尾的空白符
空白符就是空格,換行,回車,制表符等等
os.path.exists這個是用來檢測文件是否存在,以’r‘方式打開文件,若文件不存在,則會拋出異常。
clear是用來清空列表的。
讀檔要先對文件進行檢查,看文件是否存在,然后對文件中的內(nèi)容進行遍歷,將文件的內(nèi)容寫入到一個字典里,因為一個字典就是一個列表的里的元素,一個元素就是一個學(xué)生。前面我們說過,文件里的內(nèi)容是用4個\t
來分割的,在去除空白符之后,可以用split
來拆分字符,拆分之后返回分割后的字符串列表,因為學(xué)生的內(nèi)容只要四個,所以我們可以用一個元素來接收split的返回值,并判斷該元素是否有4個,對此做出是否異常判斷。
def load(): """ 讀檔 """ # 若文件不存在,則直接跳過讀檔流程 #為了避免讀方式打開文件,文件不存在造成的拋出異常 if not os.path.exists('d:/FileOperator/Stu.txt'): return global StuList StuList.clear() with open('d:/FileOperator/Stu.txt','r',encoding = 'UTF8') as f: for line in f: #針對這一行的數(shù)據(jù),按照\t進行切分操作 #卻分之前,取到文件里的換行 line = line.strip() tokens = line.split('\t') if len(tokens) != 4: print(f'當(dāng)前行格式有問題! line = {line}') continue StuDict = { 'StuId':tokens[0], 'StuName':tokens[1], 'StuGender':tokens[2], 'StuClass':tokens[3] } StuList.append(StuDict) print('讀檔成功')
打包成exe程序發(fā)布
先打開終端,
然后輸入pip install pyinstaller
按回車,然后就開始下載了。
在輸入
pyinstaller -F StudentManagementSystem.py
StudentManagementSystem.py
這個名字我是對這個文件的命名,這個名字是要打包的文件名。
之后就會出來很多東西,不用搭理他,最后會在目錄里出現(xiàn)一個dist
文件,點開就是要打包的文件。
點開這個exe文件也可以使用學(xué)生管理系統(tǒng)。
這樣就可以把這個程序拷貝給其他機器是用來,無需Python環(huán)境即可運行
代碼
""" 學(xué)生管理系統(tǒng) 珍惜在學(xué)校的時間。 """ import sys import os #使用這個全局變量,來管理所有學(xué)生的信息 #表的每一個元素都是字典,每一個字典就是一個同學(xué) StuList = [] def save(): """ 用于存檔 """ with open('d:/FileOperator/Stu.txt','w',encoding = 'UTF8') as f: for s in StuList: f.write(f"{s['StuId']}\t{s['StuName']}\t{s['StuGender']}\t{s['StuClass']}\n") print(f'存檔成功,共存儲了{len(StuList)}個記錄') def load(): """ 讀檔 """ # 若文件不存在,則直接跳過讀檔流程 #為了避免讀方式打開文件,文件不存在造成的拋出異常 if not os.path.exists('d:/FileOperator/Stu.txt'): return global StuList StuList.clear() with open('d:/FileOperator/Stu.txt','r',encoding = 'UTF8') as f: for line in f: #針對這一行的數(shù)據(jù),按照\t進行切分操作 #卻分之前,取到文件里的換行 line = line.strip() tokens = line.split('\t') if len(tokens) != 4: print(f'當(dāng)前行格式有問題! line = {line}') continue StuDict = { 'StuId':tokens[0], 'StuName':tokens[1], 'StuGender':tokens[2], 'StuClass':tokens[3] } StuList.append(StuDict) print('讀檔成功') def menu(): print('1.新增學(xué)生') print('2.顯示學(xué)生') print('3.查找學(xué)生') print('4.刪除學(xué)生') print('0.退出程序') choice = input('請輸入您的選擇:') return choice def insert(): StuId = input('請輸入學(xué)生的學(xué)號:') StuName = input('請輸入學(xué)生的姓名:') StuGender = input('請輸入學(xué)生的性別:') if StuGender not in ('男','女'): print('性別輸入不符合的內(nèi)容不符合要求') return StuClass = input('請輸入學(xué)生的班級:') #使用一個字典把上述信息給聚合起來 StuDict = { 'StuId':StuId, 'StuName':StuName, 'StuGender':StuGender, 'StuClass':StuClass } global StuList StuList.append(StuDict) save() print('新增學(xué)生完畢') def show(): #遍歷全局變量的這個列表,把每個學(xué)生的信息給打印出來。 print(f'[{["StuId"]}]\t{["StuName"]}\t{["StuGender"]}\t{["StuClass"]}') for stu in StuList: print(f'[{stu["StuId"]}]\t\t\t{stu["StuName"]}\t\t\t{stu["StuGender"]}\t\t\t\t{stu["StuClass"]}') print(f'顯示學(xué)生完畢!共有{len(StuList)}個學(xué)生') def find(): name = input('請輸入要查找的同學(xué)的姓名') cnt = 0 flag = False print(f'[{["StuId"]}]\t{["StuName"]}\t{["StuGender"]}\t{["StuClass"]}') for stu in StuList: if name == stu['StuName']: print(f'[{stu["StuId"]}]\t\t\t{stu["StuName"]}\t\t\t{stu["StuGender"]}\t\t\t\t{stu["StuClass"]}') cnt += 1 flag = True if not flag: print(f'沒有找到與該姓名相匹配的同學(xué)') print(f'查找到了{cnt}個匹配的同學(xué)') def delete(): name = input('請輸入要刪除學(xué)生的姓名') flag = False #看看這個要函數(shù)學(xué)生的姓名對應(yīng)列表中的哪個元素,把這個元素刪除了就好 for stu in StuList: if name == stu['StuName']: StuList.remove(stu) flag = True if not flag: print('沒有找到該學(xué)生,請重新查找') res = input('若不進行刪除,則輸入1,退出刪除程序,輸入其他則重新刪除學(xué)生') if res == '1': pass else: delete() save() #刪除之后學(xué)生的人數(shù)為 print(f'刪除之后學(xué)生的人數(shù)為{len(StuList)}') def main(): """ 入口函數(shù) """ #通過控制臺和用戶進行交互 print('----------------------------------------') print('| 歡迎來到學(xué)生管理系統(tǒng) |') print('----------------------------------------') load() while True: #通過menu函數(shù)來打印除菜單 ret = menu() if ret == '1': #新增學(xué)生 insert() elif ret == '2': #顯示學(xué)生 show() elif ret == '3': #查找學(xué)生 find() elif ret == '4': #刪除學(xué)生 delete() elif ret == '0': #退出程序 print('bye bye') sys.exit(0) else: print("輸入錯誤,請重新輸入") #進入下次循環(huán),讓用戶重新輸入 continue main()
到此這篇關(guān)于Python實現(xiàn)一個完整學(xué)生管理系統(tǒng)的文章就介紹到這了,更多相關(guān)Python學(xué)生管理系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于Python實現(xiàn)一個簡單的學(xué)生管理系統(tǒng)
- 基于Python實現(xiàn)面向?qū)ο蟀鎸W(xué)生管理系統(tǒng)
- Python實現(xiàn)功能全面的學(xué)生管理系統(tǒng)
- Python實現(xiàn)學(xué)生管理系統(tǒng)并生成exe可執(zhí)行文件詳解流程
- 一篇文章教你用Python實現(xiàn)一個學(xué)生管理系統(tǒng)
- Python實現(xiàn)學(xué)生管理系統(tǒng)(面向?qū)ο蟀?
- python實現(xiàn)學(xué)生管理系統(tǒng)源碼
- Python使用pyinstaller實現(xiàn)學(xué)生管理系統(tǒng)流程
相關(guān)文章
python基礎(chǔ)之編碼規(guī)范總結(jié)
今天帶大家來學(xué)習(xí)python基礎(chǔ)知識,文中對python編碼規(guī)范作了詳細的介紹,對正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05flask中使用SQLAlchemy進行輔助開發(fā)的代碼
在Web.py, Django, Flask, Tornado里,自帶的ORM功能比較缺乏,推薦大家使用SQLAlchemy來輔助開發(fā)2013-02-02