张晨旺 发表于 2020-11-28 10:55:12

python希望实现学生信息管理系统的删除模块

import os
filename='student.txt'
def menu():#主菜单界面
    print("============================学生信息管理系统===========================")
    print('--------------------------------主菜单-------------------------------')
    print('\t\t\t\t\t1.录入学生信息')
    print('\t\t\t\t\t2.查找学生信息')
    print('\t\t\t\t\t3.删除学生信息')
    print('\t\t\t\t\t4.修改学生信息')
    print('\t\t\t\t\t5.排序')
    print('\t\t\t\t\t6.统计学生总人数')
    print('\t\t\t\t\t7.显示学生信息')
    print('\t\t\t\t\t0.退出系统')
    print('--------------------------------------------------------------------')
    print("====================================================================")
#******************************************************此模块功能已实现******************************************************************
def main():
    while True:
      menu()
      number=int(input("请选择功能:"))
      if number in :
            if number == 0:
                end=input("请确认是否退出(y/s)")
                if end == 'y' or end == 'Y':
                  print("成功退出,感谢您的使用!!")
                  break
                else:
                  continue
            elif number == 1:
                insert()#插入

            elif number == 2:
                find()#查找

            elif number == 3:
                delete()#删除

            elif number == 4:
                modify()#修改

            elif number == 5:
                sort()#排序

            elif number == 6:
                total()#统计总数

            elif number == 7:
                show()#显示学生信息
#******************************************此模块功能已实习********************************************************
def insert():#录入学生数据
    stulist=[]#保存学生信息的列表
    while True:
      try:
            stu_id=int(input('请录入学生ID(如:1001)'))
      except:#输入错误格式会要求重新输入
            print("没有输入正确格式的学生id,返回至主菜单")
            break
      stu_name=input('请输入学生姓名:')
      if not stu_name:#如果名字输入的是空字符
            print("学生姓名输入为空,返回至主菜单")
            break
      stu_chinese=int(input('请输入学生的语文成绩:'))
      stu_math = int(input('请输入学生的数学成绩:'))
      stu_english = int(input('请输入学生的英语成绩:'))

      student_dic={'id':stu_id,'name':stu_name,'chinese':stu_chinese,'math':stu_math,'english':stu_english}#将学生信息存放到字典里
      stulist.append(student_dic)#将字典里的学生信息存放到列表中

      answer=input("是否继续录入学生信息(y/n)")
      if answer == 'y' or answer == 'Y':
            continue
      else:
            break

    save(stulist)

def save(lit):#保存
    file_stu=open(filename,'a',encoding="utf-8")
    for i in lit:
      file_stu.write(str(i)+'\n')

    file_stu.close()
#**********************************************此模块功能已实现*********************************************************************
def delete():
    while True:
      id=input("请输入要删除的学生的ID:")
      if id != '':#如果输入的id不为空
            if os.path.exists(filename):#如果文件不为空,表示这个文件存在
                with open(filename,'r',encoding='utf-8') as file:#只读打开文件,utf-8编码
                  student_old=file.readline()#按行读取
            else:
                student_old=[]
       # else:continue#为空就直接重新循环
      flag=False#删除标志初始化为False
      if student_old != '':
            with open(filename,'w',encoding='utf-8') as wfile:#只写打开文件,打开时会覆盖之前的内容
                zidian={}   #定义一个空字典,用来暂时存储文件中的每一行内容
                for i in student_old: #遍历列表,每个i就是每个学生的信息
                  zidian = dict(eval(i)) #************显示此处出错!!!************
                  # 希望实现功能:先将str类型的i转为代码,再转为字典。
                  if zidian['id'] == id:
                        flag=True
                  else:
                        wfile.write(str(zidian)+'\n')

                if flag == True:
                  print("学号为%s的学生信息已经删除"% id)
                else:
                  print("没有找到学号为%s的学生信息"% id)

                answer=input("请问是否继续删除(y/n)")
                if answer=='y' or answer == 'Y':
                  continue
                else:break


#*************************************此模块功能有问题*********************************************************


def find():
    pass



def modify():#修改
    pass

def sort():
    pass

def total():#统计总数
    pass

def show():
    pass

if __name__ == '__main__':
    main()


'''zidian = dict(eval(i)) #************显示此处出错!!!************
也不能正常的实现功能。python初学者。找不到问题。只好把写的代码全发上来了
谢谢大家。'''

jackz007 发表于 2020-11-28 11:14:53

本帖最后由 jackz007 于 2020-11-28 11:16 编辑

      文件没读完先被清空。
      函数 delete() 中的这一句
                  student_old=file.readline()
      改为
                  student_old=list(file)

suchocolate 发表于 2020-11-28 11:17:54

本帖最后由 suchocolate 于 2020-11-28 11:44 编辑

eval是执行代码,直接用就行:
zidian = eval(i)

另外如果filename是存多个学生的信息,那么delete函数打开文件获取的信息不能保证获取的就是那个id的信息。
用得用re匹配出来才行:
import re


txt = '''
{'id':1001,'name':'小花','chinese':100,'math':100,'english':100}
{'id':1002,'name':'小白','chinese':100,'math':100,'english':100}
{'id':1003,'name':'小黑','chinese':100,'math':100,'english':100}
'''
id = 1002
result = re.findall(f'.*{id}.*', txt, re.M)
print(result)

张晨旺 发表于 2020-11-28 11:35:39

jackz007 发表于 2020-11-28 11:14
文件没读完先被清空。
      函数 delete() 中的这一句



谢谢。确实可以正常运行了。但是我录入1001学号的信息,删除的时候,显示没有这个学生,并且txt会清空,但是我重新录入的时候,数据又全部回来了

张晨旺 发表于 2020-11-28 11:41:01

张晨旺 发表于 2020-11-28 11:35
谢谢。确实可以正常运行了。但是我录入1001学号的信息,删除的时候,显示没有这个学生,并且txt会清空 ...

请选择功能:3
请输入要删除的学生的ID:1001
1001
{'id': 1001, 'name': '2', 'chinese': 3, 'math': 4, 'english': 4}
没有找到学号为1001的学生信息
请问是否继续删除(y/n)

张晨旺 发表于 2020-11-28 11:43:48

张晨旺 发表于 2020-11-28 11:41
请选择功能:3
请输入要删除的学生的ID:1001
1001


万分感谢。找到问题了。是因为id接受input输入为str类型。但是字典里面id的值是int类型,对比找不到。

张晨旺 发表于 2020-11-28 11:50:18

suchocolate 发表于 2020-11-28 11:17
eval是执行代码,直接用就行:




感谢您。现在还只写了两个模块。后面在边学习边写。非常感谢
页: [1]
查看完整版本: python希望实现学生信息管理系统的删除模块