用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