您的位置:首页 > 编程语言 > Python开发

基于pickle模块的学生管理系统

2017-10-01 16:14 302 查看
title: 基于pickle模块的学生管理系统

date: 2017-08-03 20:54:39

categories: technology

tags:

- python

利用模块pickle完成学生信息管理系统

Python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

学生系统功能分为

1. Add

2. Delect

3. Show

4. Save

5. Read

6. Quit

# !/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
# -*- coding: utf-8 -*-

import pickle

class Student:
def __init__(self, studentID, name, sex, classID):
self.studentID = studentID
self.name = name
self.sex = sex
self.classID = classID

class StudentManager:
def __init__(self):
self.students = []

def mainMenu(self):
print('\nTips:')
print('1.Add studentInfo')
print('2.Delect studentInfo')
print('3.Show studentInfo')
print('4.Save studentInfo')
print('5.Read studentInfo')
print('0.Quit')
flag = input('Select Operation:')
while (flag < '0' or flag > '5'):
print('Input Error!')
flag = input('Select Again:')
print('------------')
if (flag == '1'):
self.addStu()
self.mainMenu()
if (flag == '2'):
self.delStu()
self.mainMenu()
if (flag == '3'):
self.printStu()
self.mainMenu()
if (flag == '4'):
self.writeStu()
self.mainMenu()
if (flag == '5'):
self.readStu()
self.mainMenu()
if (flag == '0'):
self.writeStu() # Save before quit
print('End')

def addStu(self):
studentID = input('Plaese input studentID: ')
while (self.findByID(studentID) != -1):
print('studentID repeat, please input again')
studentID = input('Please input studentID again')
name = input('Please input student name: ')
sex = input('Please input student sex: ')
sex
while ((sex != 'f') and (sex != 'm')):
print('Sex input error, please input sex again')
sex = input('Please input student sex again: ')
classID = input('Please input student classID: ')
student = Student(studentID, name, sex, classID)
self.students.append(student)
print('Add success!')

def delStu(self):
studentID = input('Please input the studentID you want to del: ')
i = self.findByID(studentID)
while (i == -1):
print('No this studentID, please input studentID again!')
studentID = input("Please input the studentID again: ")
i = self.findByID(studentID)
del(self.students[i])
print('Del success!')

def printStu(self):
print('----------')
print('%7s%7s%7s%7s'%('StudentID', 'Name', 'Sex', ' ClassID'))
for student in self.students:
print('%7s%7s%7s%7s'%(student['studentID'], student['name'], student['sex'], student['classID']))

def findByID(self, studentID):
i = 0;
for student in self.students:
if (student['studentID'] == studentID):
return i # return number
i = i+1
return -1 # find fail

def writeStu(self):
try:
fout = open(r'/Users/yangyang/Developer/Python/file/save.db', 'wb')
except IOError as e: ###python3
print('No file exist!')
else:
pickle.dump(self.students, fout)
fout.close()
print('Save success!')

def readStu(self):
try:
fin = open(r'/Users/yangyang/Developer/Python/file/save.db', 'rb')
except FileNotFoundError as e: ### python3: as
print('No file exist, please save first!')
else:
print('On reading', end='')
print('...', end='')
self.students = pickle.load(fin)
print('...')
print('Read file success!')
fin.close()

sm = StudentManager()
print('\n\n')
print('===========================')
print('    StudentManagerSystem')
print('===========================')
sm.readStu()
sm.mainMenu()


写完后发现一直报错

self.students = pickle.load(fin)
EOFError: Ran out of input


最后在

Stack OverFlow找到答案。因为读取的文件为空。

解决办法:

在save.db里面事先写入数据

# !/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
# -*- coding: utf-8 -*-

import pickle

student = {'studentID': '0001', 'name':'W', 'sex': 'F', 'classID':'1111'}

students = []
students.append(student)

fout = open(r'/Users/yangyang/Developer/Python/file/save.db', 'wb')
pickle.dump(students, fout)
print('Save success!')
fout.close()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息