55-学生管理系统

import os
def read_stus():
    '''文件中存放数据的格式
    zst33\t2323434   #\t表示一个Tab,本程序等价于4个空格
    ls\t22\t3445454
    ww\t33\t2354565
    '''
    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\t%s\t%s"%(student['name'],student['age'],student['qq'])
        f.write(student_str) #覆盖式写入,就要保证每次的stus都包含了上一次的数据及本次的增量更新
        f.write("\n") #这一行结束,文件指针指向下一行
    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\t%s\t%s"%(item["name"],item["age"],item["qq"]))
     
def print_all_students():
    print("序号\t姓名\t年龄\tQQ号")
    for i,item in enumerate(stus,1): #1是指迭代的序号i从1开始,难道还会从0开始?
        print("%s\t"%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
posted @ 2018-03-04 14:34  hzhang_NJU  阅读(144)  评论(0编辑  收藏  举报