'''文件修改周期及修改人
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语言就是递归,然后跳出再执行上一层?