鱼C论坛

 找回密码
 立即注册
查看: 1708|回复: 6

[已解决]python希望实现学生信息管理系统的删除模块

[复制链接]
发表于 2020-11-28 10:55:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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 [0,1,2,3,4,5,6,7]:
            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初学者。找不到问题。只好把写的代码全发上来了
谢谢大家。'''
最佳答案
2020-11-28 11:14:53
本帖最后由 jackz007 于 2020-11-28 11:16 编辑

        文件没读完先被清空。
        函数 delete() 中的这一句
                    student_old=file.readline()
        改为
                    student_old=list(file)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-28 11:14:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-28 11:16 编辑

        文件没读完先被清空。
        函数 delete() 中的这一句
                    student_old=file.readline()
        改为
                    student_old=list(file)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)[0]
print(result)
Screenshot 2020-11-28 114428.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-28 11:35:39 | 显示全部楼层
jackz007 发表于 2020-11-28 11:14
文件没读完先被清空。
        函数 delete() 中的这一句


谢谢。确实可以正常运行了。但是我录入1001学号的信息,删除的时候,显示没有这个学生,并且txt会清空,但是我重新录入的时候,数据又全部回来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-28 11:43:48 | 显示全部楼层
张晨旺 发表于 2020-11-28 11:41
请选择功能:3
请输入要删除的学生的ID:1001
1001

万分感谢。找到问题了。是因为id接受input输入为str类型。但是字典里面id的值是int类型,对比找不到。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-28 11:50:18 | 显示全部楼层
suchocolate 发表于 2020-11-28 11:17
eval是执行代码,直接用就行:

感谢您。现在还只写了两个模块。后面在边学习边写。非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 14:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表