import os
def read_stus():
'''文件中存放数据的格式
zst33 2323434 # 表示一个Tab,本程序等价于4个空格
ls 22 3445454
ww 33 2354565
'''
if os.path.exists(file_name): # 判断文件或者目录是否存在
f=open(file_name,"r")
while True:
student_str=f.readline() #逐行读
# print(student_str)
if student_str=='': #读完了
break
else:
#print(student_str+"===========")
student_info_list=student_str.split() #用空格分割student_str为一个list,下一部改造成dict
student={"name":student_info_list[0],"age":student_info_list[1],"qq":student_info_list[2]}
stus.append(student) #把当前这个student(一个dict), append到全局变量stus中,构成一个list
#dict和list,在局部函数区可以对一个全局变量,执行append和pop,但是赋值要global关键字
#普通类型变量,在局部函数区想对一个全局变量,执行引用或者赋值操作,都必须用global
f.close()
#print(stus)
def write_stus_to_file():
if os.path.exists(file_name):
if os.path.exists(backup_file):
os.remove(backup_file) # 删除之前的旧备份
os.rename(file_name,"backup-"+file_name) #
f=open(file_name,"w") #每次都被上面的rename了,所以重新创建一个空的file_name.txt,再写入
for student in stus: #逐个取出每一个student,格式化放入文件中
student_str="%s %s %s"%(student['name'],student['age'],student['qq'])
f.write(student_str) #覆盖式写入,就要保证每次的stus都包含了上一次的数据及本次的增量更新
f.write("
") #这一行结束,文件指针指向下一行
f.close()
def print_menu():
print("="*30)
print("学生管理系统".center(30))
print("输入1:添加学生")
print("输入2:查找学生")
print("输入3:修改学生")
print("输入4:删除学生")
print("输入5:查看所有学生")
print("输入6:退出")
def add_student(): #修改stu这个list,新增一项
name=input("请输入学生的姓名:")
age=int(input("请输入学生的年龄:"))
qq=input("请输入学生的QQ号:")
#一个学生包括三个信息,这三个信息存到一个字典中
stu={}#申明一个字典变量 #这是局部变量
stu["name"]=name#往字典中添加一个原始
stu["age"]=age#往字典中添加一个原始
stu["qq"]=qq#往字典中添加一个原始
stus.append(stu) #向全局的stus新增了一项
def search_student(name):
for item in stus:
if item["name"]==name.strip():#判断字典中包含有改学生的姓名 {strip去除多余的空格}
print("%s 学生存在"%name)
print_student(item)
#break
return item
else:#break是整个循环终止。不会执行else
print("学生%s没有找到"%name)
def print_student(item):
print("%s %s %s"%(item["name"],item["age"],item["qq"]))
def print_all_students():
print("序号 姓名 年龄 QQ号")
for i,item in enumerate(stus,1): #1是指迭代的序号i从1开始,难道还会从0开始?
print("%s "%i,end="") #输出一个序号i和4个空格{即1个Tab},end=""是默认参数?
print_student(item)
def del_student(name):
student=search_student(name) #在全局的stus中找到这一项
stus.remove(student) #把stus的这一项删除掉
def main():
print_menu()
read_stus()
while True: #一直在检测输入操作,所以不会自动结束
operate=input("请输入你想要的操作:")
if operate=="1":
add_student() #在原来的stus基础上新增了一项
write_stus_to_file() #立即写入文件,待会儿要用再从更新后的文件中读入
print("添加成功")
if operate=="2":
name=input("请输入要查找学生的姓名:")
search_student(name)
if operate == "3":
pass
if operate=="4":
name=input("请输入要删除的学生姓名:")
del_student(name) #在原来stus基础上,删除了一项
write_stus_to_file() #立即写入文件,待会儿要用它,再从更新后的文件中读入
print("删除学生%s成功"%name)
if operate=="5":
print_all_students()
if operate=="6":
break
#全局变量
file_name="stus.txt"#存放学生数据的文件
backup_file="backup-stus.txt"
#一个学生包含很多信息,一个学生一个字典。学生列表用列表存储
stus=[]
main()
- 注:在与本文件同级目录下,新建backup-stus.txt和stus.txt