Python Learning Journal:Day5
学生信息管理系统(python)
花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程) P135-145
系统需求
1、录入学生信息:控制台按提示信息输入学生信息,保存至.txt文件中
2、查找学生信息:按ID或姓名查找学生信息
3、删除学生信息:删除指定ID学生信息
4、修改学生信息:修改指定ID学生信息
5、排序学生信息:按英语、python、java成绩对学生信息进行升序、降序处理,结果显示在控制台上
6、统计学生总人数:统计文件中保存学生信息个数
7、显示所有学生信息
8、系统打包生成.exe文件
重点部分代码
输入的学生信息保存至字典中、所有学生信息保存至列表中
stu_list = []
student = {'id': id, 'name': name, 'english': english, 'python': python, 'java': java}
stu_list.append(student)
学生信息逐行保存至文件中
try…except…处理:保证文件存在时,按追加形式写入,文件不存在时,按写方式写入。
str:文件中保存字符类型
def save(stu_list):
try:
text = open(filename, 'a', encoding='utf-8')
except:
text = open(filename, 'w', encoding='utf-8')
for item in stu_list:
text.write(str(item) + '\n')
text.close()
按行读取.txt文件内容
调用os.path.exits()判断是否存在filename文件,若存在,则调用上下文管理器with打开文件。
调用readlines()方法,按行读入文件内容至列表中,格式为str类型。
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as text:
stu_list = text.readlines()
else:
stu_list = []
当item是以字典形式保存时,通过以下方式实现字符串与字典转换
item是stu_list列表元素
d = dict(eval(item))
排序方法
调用已有的sort函数,实现排序
key:排序对象,x表示stu_new_list中的元素(即学生信息字典)
reverse:排序方式,升序 or 降序,升序False,降序True
res = input('请选择(0升序1降序):')
if res == '0':
res = False
elif res == '1':
res = True
else:
print('请输入正确的数字选项!')
continue
stu_new_list.sort(key=lambda x: float(x['english']), reverse=res)
输出格式
规定位长输出
def show_all(item):
grades = total(item)
d = dict(eval(item))
# 标题格式化输出
format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
print(format_title.format('ID', '姓名', '英语成绩', 'python成绩', 'java成绩', '总成绩'))
# 内容格式化输出
format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
print(format_data.format(d['id'], d['name'], d['english'], d['python'], d['java'], grades))
输出文字+已有变量
print(f'ID为{id}的学生信息不存在')
打包exe文件
1、anaconda prompt:
进入anaconda安装目录:由于anaconda prompt不能直接切换其他盘,因此需cd ..
切换
(base) C:\Users\dell>cd ..
(base) C:\Users>cd ..
(base) C:\>d:
(base) D:\>cd anaconda3
(base) D:\anaconda3>cd Scripts
(base) D:\anaconda3\Scripts>
2、安装pyinstaller库
在anaconda prompt中输入以下命令,即可安装
(base) D:\anaconda3\Scripts>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller
3、打包exe文件
在anaconda prompt中进入目标目录,输入以下命令,即可打包至目标目录
(base) D:\>pyinstaller -F D:\pythonProject\pythonProject01\main.py
根据提示可知,exe文件在D盘dist目录下
全部代码(参考B站视频,链接在开头)
"""
学生信息管理系统
2022.01.14
功能:输入、查询、删除、修改、排序
"""
import os
import re
filename = 'student.txt'
def main():
while True:
menu()
choose = int(input()) # 输入的是字符串
if choose == 1:
insert()
elif choose == 2:
search()
elif choose == 3:
delete()
elif choose == 4:
modify()
elif choose == 5:
sort()
elif choose == 6:
total_stu()
elif choose == 7:
show()
elif choose == 0:
print('您确定要退出系统吗?y/n——')
ans = input()
if ans == 'y' or ans == 'Y':
print('谢谢使用!')
break
else:
continue
else:
continue
def insert():
stu_list = []
while True:
id = input('请输入ID(如1001):')
if len(id) == 0: # if not id
continue
name = input('请输入姓名:')
if not name:
continue
try:
english = float(input('请输入英语成绩:'))
python = float(input('请输入python成绩:'))
java = float(input('请输入java成绩:'))
except:
print('输入无效,请重新输入!')
continue
# 将输入的学生信息保存到字典中
student = {'id': id, 'name': name, 'english': english, 'python': python, 'java': java}
stu_list.append(student)
answer = input('是否继续添加学生信息?:y/n')
if answer == 'Y' or answer == 'y':
continue
else:
save(stu_list)
return
def save(stu_list):
try:
text = open(filename, 'a', encoding='utf-8')
except:
text = open(filename, 'w', encoding='utf-8')
for item in stu_list:
text.write(str(item) + '\n')
text.close()
# 按ID查询
# 按姓名查询
def search():
while True:
res = input('按ID查询请输入1,按姓名查询请输入2:')
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as text:
stu_list = text.readlines()
else:
stu_list = []
flag = False
if res == '1':
id = input('请输入学生ID:')
for item in stu_list:
d = dict(eval(item))
if id != d['id']:
continue
else:
flag = True
show_all(item)
if not flag:
print('没有查询到学生,无数据可显示')
elif res == '2':
newname = input('请输入学生姓名')
for item in stu_list:
d = dict(eval(item))
if d['name'] != newname:
continue
else:
flag = True
show_all(item)
if not flag:
print('没有查询到学生,无数据可显示')
else:
continue
answer = input('是否继续查询?y/n')
if answer == 'Y' or answer == 'y':
continue
else:
return
# 删除学生信息(若学生不存在则需提示、若保存学生信息文件不存在则需显示)
# 展示删除后的全部学生信息
def delete():
while True:
id = input('请输入要删除学生的id:')
if not id:
continue
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as text:
stu_old = text.readlines() # 字符串列表
else:
stu_old = []
flag = False # 标识是否被删除/是否被找到
if stu_old:
with open(filename, 'w', encoding='utf-8') as newtext: # 写覆盖
d = {}
for item in stu_old:
d = dict(eval(item)) # 将字符串转成字典
if d['id'] != id:
newtext.write(str(d) + '\n') # 字典转换成字符串保存
else:
flag = True
if flag:
print(f'id为{id}的学生信息已被删除')
else:
print(f'未找到id为{id}的学生')
else:
print('无学生信息')
break
show()
answer = input('是否继续删除?y/n')
if answer == 'Y' or answer == 'y':
continue
else:
return
def modify():
while True:
id = input('请输入要修改的学员ID:')
if not id:
continue
flag = False
if os.path.exists(filename):
text = open(filename, 'r', encoding='utf-8')
stu_list = text.readlines()
else:
stu_list = []
if stu_list:
with open(filename, 'w', encoding='utf-8') as newtext:
for item in stu_list:
d = dict(eval(item))
if d['id'] != id:
newtext.write(str(d) + '\n')
else:
flag = True
print('找到这名学生,可以修改他的相关信息了!')
while True:
try:
d['name'] = input('请输入姓名:')
d['english'] = input('请输入英语成绩:')
d['python'] = input('请输入python成绩:')
d['java'] = input('请输入java成绩:')
except:
print('您的输入有误,请重新输入!')
else:
break
newtext.write(str(d) + '\n')
if not flag:
print(f'ID为{id}的学生信息不存在')
else:
print('无学生信息')
break
show()
answer = input('是否继续修改学生信息?y/n')
if answer == 'Y' or answer == 'y':
continue
else:
return
def sort():
stu_new_list = []
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as text:
stu_list = text.readlines()
else:
return
# 标题格式化输出
format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
print(format_title.format('ID', '姓名', '英语成绩', 'python成绩', 'java成绩', '总成绩'))
if stu_list:
for item in stu_list:
d = dict(eval(item))
stu_new_list.append(d)
grades = total(item)
# 内容格式化输出
format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
print(format_data.format(d['id'], d['name'], d['english'], d['python'], d['java'], grades))
while True:
res = input('请选择(0升序1降序):')
if res == '0':
res = False
elif res == '1':
res = True
else:
print('请输入正确的数字选项!')
continue
way = input('请选择排序方式(1:按英语成绩排序,2:按python成绩排序,3:按java成绩排序,0:按总成绩排序):')
if way == '1':
# sort排序函数:key排序对象
# reverse:排序方式--False升序、True降序
stu_new_list.sort(key=lambda x: float(x['english']), reverse=res)
show_sort(stu_new_list)
elif way == '2':
stu_new_list.sort(key=lambda x: float(x['python']), reverse=res)
show_sort(stu_new_list)
elif way == '3':
stu_new_list.sort(key=lambda x: float(x['java']), reverse=res)
show_sort(stu_new_list)
elif way == '0':
stu_new_list.sort(key=lambda x: float(x['english'] + x['python'] + x['java']), reverse=res)
show_sort(stu_new_list)
else:
print('请输入正确的数字选项!')
continue
answer = input('是否继续排序?y/n')
if answer == 'Y' or answer == 'y':
continue
else:
return
else:
print('暂未保存学生信息!')
def total_stu():
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as text:
stu_list = text.readlines()
if stu_list:
print('一共有{}名学生'.format(len(stu_list)))
else:
print('还未录入学生信息!')
else:
print('暂未保存学生信息!')
def total(item):
d = dict(eval(item))
grades = float(d['python']) + float(d['english']) + float(d['java'])
return grades
def show():
text = open(filename, 'r', encoding='utf-8')
stu_list = text.readlines()
if stu_list:
for item in stu_list:
d = dict(eval(item))
print('学生id为:' + d['id'] + ' 姓名:' + d['name'] + ' English:' + str(d['english']) + ' Python:' + str(
d['python']) + ' Java:' + str(d['java']))
else:
print('暂未保存学生信息!')
def show_all(item):
grades = total(item)
d = dict(eval(item))
# 标题格式化输出
format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
print(format_title.format('ID', '姓名', '英语成绩', 'python成绩', 'java成绩', '总成绩'))
# 内容格式化输出
format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
print(format_data.format(d['id'], d['name'], d['english'], d['python'], d['java'], grades))
def show_sort(stu_new_list):
# 标题格式化输出
format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
print(format_title.format('ID', '姓名', '英语成绩', 'python成绩', 'java成绩', '总成绩'))
for item in stu_new_list:
# 内容格式化输出
format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
print(format_data.format(item['id'], item['name'], item['english'], item['python'], item['java'], item['english']+item['python']+item['java']))
def menu():
print('--------------------学生信息管理系统--------------------')
print('------------------------功能--------------------------')
print(' 1.录入学生信息')
print(' 2.查找学生信息')
print(' 3.删除学生信息')
print(' 4.修改学生信息')
print(' 5.排序学生信息')
print(' 6.统计学生总人数')
print(' 7.显示所有学生信息')
print(' 0.退出系统')
print('*****************************************************')
print('您的选择是:')
if __name__ == '__main__':
main()
写在最后:设计系统时,一定要确立需求,再编写函数。