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()