用Python实现学生信息管理系统(对象序列化)

用Python pandas实现学生信息管理系统

实现以对象的形式存储文件 我这里用的是 pickle

这里是类 这里只用了封装的思想 但是没有体现类里面方法的作用(正确输入的判断 我没有作详细的判断)

# 注解:学生类 包括学号,姓名,性别,年龄,籍贯等基本信息
class Student:
    __student_number = 0    #学号
    __name = ' '    #姓名
    __sex = ' '    #性别
    __age = 0    #年龄
    __native_place = ' '    #籍贯

    def __init__(self,num,name,sex,age,place):
        self.set_student_number(num)
        self.set_name(name)
        self.set_sex(sex)
        self.set_age(age)
        self.set_native_place(place)

    def set_student_number(self,num):
        self.__student_number = num

    def get_student_number(self):
        return self.__student_number

    def set_name(self,name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_sex(self,sex):
        self.__sex = sex

    def get_sex(self):
        return self.__sex

    def set_age(self,age):
        self.__age = age

    def get_age(self):
        return self.__age

    def set_native_place(self,place):
        self.__native_place = place

    def get_native_place(self):
        return self.__native_place

    def __str__(self):
        return str(self.get_student_number())+" "+self.get_name()+" "+self.get_sex()+" "+str(self.get_age())+" "+self.get_native_place()
        
下面是系统主体部分

```python
#!/usr/bin/python3
#Author:Qianshi
# -*- coding: utf-8 -*-
# @Time   :2020/12/18 13:53
# @Author :Qianshi
# @Site   :system.py
# @Software:PyCharm
# 注解:开发一个系统,能够输入n个学生的基本信息,并保存在文件中;能够查询、修改、删除学生信息;
from curriculum_design.the_first_question.Student import Student
import pickle
import pandas as pd
import traceback

file_add = r'e:\code\test\student_imformation.pkl'    #文件地址
# file_add = "1.pkl"    #文件地址

def query(col,str):    #查询方法
    df = to_dataframe()
    imfor = df.loc[df[col]==str]     #获取指定内容的行
    if imfor.empty :
        return "没有该内容 , 请重新输入"
    else:
        return imfor

def delete(str):    #删除方法
    df = to_dataframe()
    imfor = df.loc[df['学号'] == str]  # 获取指定内容的行
    if imfor.empty :
        print("没有该内容 , 请重新输入")
    else:
        num = imfor.index.values[0]
        with open(file_add,"rb+") as f:
            rq = pickle.loads(f.read(),encoding='bytes')
            # 将文件指针指向最开始的地方
            f.seek(0)

            del rq[(num+1)]
            str = pickle.dumps(rq)
            f.write(str)
        print("删除成功!")

def alter(num,col,str):    #修改方法
    df = to_dataframe()
    imfor = df.loc[df['学号'] == num]  # 获取指定内容的行
    if imfor.empty:
        print("没有该内容 , 请重新输入")
    else:
        num = imfor.index.values[0]
        with open(file_add, "rb+") as f:
            rq = pickle.loads(f.read(), encoding='bytes')
            # 将文件指针指向最开始的地方
            f.seek(0)

            if col == '姓名' :
                rq[num+1].set_name(str)
            elif col == '性别' :
                rq[num + 1].set_sex(str)
            elif col == '年龄' :
                rq[num + 1].set_age(str)
            elif col == '籍贯' :
                rq[num + 1].set_native_place(str)
            else:
                print("没有该内容,重新输入")

            str = pickle.dumps(rq)
            f.write(str)

            print("修改成功!")

def add_im(str1,str2,str3,str4,str5):    #添加方法

    if already_exist(str1):
        rw = Student(str1, str2, str3, str4, str5)
        try:
            with open(file_add, 'rb+') as f:
                rq = pickle.loads(f.read(),encoding='bytes')
#将文件指针指向最开始的地方
                f.seek(0)

                num = len(rq)+1  # 字典长度
                rq[num] = rw
                str = pickle.dumps(rq)
                f.write(str)
        except Exception as e:
            print('the file is 空 %s' % e)

        print("添加成功!")
    else:
        print("该学号已存在,请重新输入")

def ordering(str):    #排序方法(按照学号排序)
    df = to_dataframe()
    if str == '学号' or str == '姓名' or str == '性别' or str == '年龄' or str == '籍贯':
        df.sort_values(str, inplace=True)
        print(df)
    else:
        print("没有该选项 , 重新输入")

def print_all():    #打印所有
    df = to_dataframe()
    print(df)

def already_exist(num):    #判断是否已经存在
    df = to_dataframe()
    imfor = df.loc[df['学号'] == num]  # 获取指定内容的行

    if imfor.empty:
        return True
    else:
        return False

def to_dataframe():    #将文件转换为dataframe类型
    try:
        with open(file_add, 'rb+') as f:
            # 读取对象文件(由于是以字典形式储存的所以提取出来操作需要进一步转换形式)
            rq = pickle.loads(f.read(),encoding='bytes')

        if not rq:    #如果字典为空
            df = pd.DataFrame(columns=['学号', '姓名', '性别', '年龄', '籍贯'])
            return df

        else:
            im = []  # 存储提取出来的数据
            for i in rq.keys():
                imf = []  # 存储提取出来的单个对象的数据
                imf.append(rq[i].get_student_number())
                imf.append(rq[i].get_name())
                imf.append(rq[i].get_sex())
                imf.append(rq[i].get_age())
                imf.append(rq[i].get_native_place())
                im.append(imf)

            df = pd.DataFrame(im)  # 将数据转化为Dataframe形式进行判断
            df.columns = ['学号', '姓名', '性别', '年龄', '籍贯']

            return df
    except Exception:
        # 文件为不存在 执行下面的语句  创建一个新的文件 并返回一个空的dataframe
        f = open(file_add, 'wb')
        a = {}
        str1 = pickle.dumps(a)
        f.write(str1)
        f.close()
        df = pd.DataFrame(columns=['学号', '姓名', '性别', '年龄', '籍贯'])
        return df

quit = False
while True:
    try :
        while(True):
            print('-----------------------------------------------------')
            print("学生系统菜单: \n 1.查询 \n 2.修改 \n 3.删除 \n 4.添加 \n 5.退出系统")
            option1 = int(input("\n 输入你要执行的选项:"))    # 输入的选项

            if(option1 == 1):    #查询功能
                option11 = int(input("\n 1.学号 2.姓名 3.性别 4.年龄 5.籍贯 6.打印所有 7.按需求排序 \n 输入你要查询的选项:"))
                if(option11 == 1):    #查询学号
                    option12 = int(input("学号:"))
                    print(query('学号',option12))
                elif(option11 == 2):    #查询姓名
                    option12 = input("姓名:")
                    print(query('姓名',option12))
                elif(option11 == 3):    #查询性别
                    option12 = input("性别:")
                    print(query('性别',option12))
                elif(option11 == 4):    #查询年龄
                    option12 = int(input("年龄:"))
                    print(query('年龄', option12))
                elif(option11 == 5):    #查询籍贯
                    option12 = input("籍贯:")
                    print(query('籍贯', option12))
                elif (option11 == 6):  # 查询籍贯
                    print_all()
                elif (option11 == 7):   #按需排序
                    option71 = input("排序类型:")
                    ordering(option71)
                else:
                    print("\n输入错误,没有该选项")

            elif(option1 == 2):    #修改功能
                option21 = int(input("输入你要修改对象的学号:"))
                option22 = int(input("\n 1.姓名 2.性别 3.年龄 4.籍贯 \n 输入你要修改的内容:"))
                if(option22 == 1):
                    option23 = input("输入修改后的姓名:")
                    alter(option21,"姓名",option23)
                elif (option22 == 2):
                    option23 = input("输入修改后的性别:")
                    alter(option21,"性别",option23)
                elif (option22 == 3):
                    option23 = int(input("输入修改后的年龄:"))
                    alter(option21,"年龄",option23)
                elif (option22 == 4):
                    option23 = input("输入修改后的籍贯:")
                    alter(option21,"籍贯",option23)
                else:
                    print("\n输入错误,没有该选项")

            elif(option1 == 3):    #删除功能
                option31 = int(input("输入你要删除对象的学号:"))
                delete(option31)

            elif (option1 == 4):  # 添加功能
                option41 = int(input("输入你要添加对象的学号:"))
                option42 = input("输入你要添加对象的姓名:")
                option43 = input("输入你要添加对象的性别:")
                option44 = int(input("输入你要添加对象的年龄:"))
                option45 = input("输入你要添加对象的籍贯:")
                add_im(option41,option42,option43,option44,option45)

            elif (option1 == 5):  # 退出系统
                print('成功退出!')
                quit = True
                break
            else:
                print("\n输入错误,没有该选项")

    except ValueError:
        print("输入错误 重新输入")
    except Exception as e:
        traceback.print_exc()

    if quit:
        break

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值