今天为大家分享一个我在学习Python做的一个小项目---基于Python的学生信息管理系统开发。今天要分享的内容有两点:
- 基于Python的学生信息管理系统开发第一部分(模型定义、excel表格处理)
- c++如何处理json格式的数据
1、基于Python的学生信息管理系统开发第一部分
这个小项目是我本科学C语言时做的一个小项目,当时是用C写的。它不具有什么可用性。之所以选择它是因为它简单,但是想做出来需要经过一些思考,通过这个过程可以把学到的所有的知识综合到一起,而不是孤立的选择结构、循环结构等。
这个系统用两次分享完,代码也会放在github上,有兴趣的朋友可以从github上*载下**自己运行一下。
(1) 准备工作
我准备为这个系统制作一个简单的界面,用PyQt5制作。然后用Excel表格作为底层数据库来存储学生的信息。这就涉及到了两个第三方模块PyQt5、openpyxl。
下面介绍一下通过Anaconda工具来安装这两个模块:
我理解的Anaconda:如果将所有的模块直接安装在系统中,会导致系统的环境混乱,而且有可能出现版本冲突,安装和卸载也很麻烦。Anaconda是一个虚拟环境管理工具,用它可以创建多个虚拟环境,虚拟环境之间是相互独立的,你可以在各自的虚拟环境中安装该环境所需要的模块,与其他的虚拟环境无关。用anaconda创建一个虚拟环境或者安装、卸载某一个模块都是一条命令的事,非常方便。
关于Anaconda的安装和入门,如果有兴趣的人可以自行搜索一下,网上有大量的教程,这里就不多花篇幅来介绍了。
安装好了之后,需要先创建一个虚拟环境,然后激活虚拟环境,最后为这个虚拟环境安装第三方库,使用anaconda创建虚拟环境并激活虚拟环境的命令如下(win系统,linux稍有不同):
# 可以直接指定python的版本 conda create -n StuSystem python=3.7 # 激活虚拟环境 conda activate StuSystem
安装openpyxl、pyqt5的命令如下
conda install openpyxl # 安装pyqt的时候先查找pyqt的版本 conda search pyqt # 然后选择你需要的版本安装就可以了 conda install PyQt=5.9.2
(2) 功能分析
制作一个系统的首要工作就是进行需求分析,当然这里的需求分析和软件功能里的需求分析不太一样,所以我更愿意将它称为功能分析。
管理员:管理员通过自己的账号、密码登录系统后,可以添加新学生的信息、查看所有学生的信息、删除某一个学生的信息、修改某一个学生的信息
学生:学生通过自己的学号、密码登录后,系统直接显示自己的个人的个人信息。
(3) 系统开发
首先,我们要考虑一下如何表示学生这个概念。你可能会很快想到可以编写一个类用来表示学生这个概念,然后我们可以创建任意多个学生类的对象表示多个学生。没错,我也是这么做的。
在学生类的基础上,我们还可以再抽象一下: 学生也属于人,所以我们可以先创建一个人的类,然后学生类继承该类。
这两个类的定义都放在model.py文件中:
#coding: utf-8
’’’
Person具有的基本属性:姓名、年龄、性别、籍贯
’’’
class Person(object):
def __init__(self, name, age, sex, birthPlace):
# 所有的属性都设置为私有
self.__name = name
self.__age = age
self.__sex = sex
self.__birthPlace = birthPlace
def get_name(self):
return self.__name
def get_age(self):
return self.__age
def get_sex(self):
return self.__sex
def get_birthPlace(self):
return self.__birthPlace
def print_self(self):
return ’name: ’ + self.get_name() \
+ ’\nage:’ + str(self.get_age()) \
+ ’\nsex: ’ + self.get_sex() \
+ ’\nbirthPlace: ’ + self.get_birthPlace()
’’’
Student继承自Person,额外的属性为:学号、学院、专业、密码
’’’
class Student(Person):
def __init__(self, name, age, sex, birthPlace, id, college, major, password):
self.__id = id
self.__college = college
self.__major = major
self.__password = password
Person.__init__(self, name, age, sex, birthPlace)
def get_id(self):
return self.__id
def get_college(self):
return self.__college
def get_major(self):
return self.__major
def print_self(self):
return Person.print_self(self) \
+ ’\nid: ’ + str(self.get_id()) \
+ ’\ncollege: ’ + self.get_college() \
+ ’\nmajor: ’ + self.get_major()
’’’
Test
’’’
if __name__ == ’__main__’:
stu = Student("liulinfeng", ’23’, "man", "BeiJing", "10001", "Computer", "Computer Science", "123456")
print(stu.print_self())
运行model.py文件的结果如下图所示:

model.py测试运行结果
下面还要考虑的是如何进行数据持久化操作,如果将所有的数据都保存在内存中的话,一旦程序关闭,重新启动所有的数据都会被清空(尽管这只是一个模拟的系统,仍然应该考虑到这一点),因此,我们必须将数据保存在离线的文件或者数据库中(这里选择Excel表格)。
对Excel表格的处理仍然借助openpyxl包来进行,openpyxl是一个专门用来处理excel表格数据的模块,对此不了解的朋友不用太在意,我后面会有专门的文章来介绍这个包。
这里我将所有对Excel表格操作的方法都封装在了FileOperate类中,FileOperate类的定义(在FileOperate.py文件中)如下:
#coding:utf-8
import openpyxl
# 导入自定义的模块
from model import Student
class ExcelOperate(object):
def __init__(self, file_name):
self.__file_name = file_name
#加载Excel文件
self.__file = openpyxl.load_workbook(file_name)
’’’
读取表格中所有学生的信息,并返回一个列表
’’’
def read_sheet(self, sheet_name):
work_sheet = self.__file[sheet_name]
# 学生列表
stuList = []
# 最大存储数据的行号
max_row_number = work_sheet.max_row
# 第1行是表头,因此从第2行开始遍历
for i in range(2, max_row_number+1):
name = work_sheet.cell(i, 1).value
age = work_sheet.cell(i, 2).value
sex = work_sheet.cell(i, 3).value
birthPlace = work_sheet.cell(i, 4).value
school_id = work_sheet.cell(i, 5).value
college = work_sheet.cell(i, 6).value
major = work_sheet.cell(i, 7).value
password = work_sheet.cell(i, 8).value
new_stu = Student(name, age, sex, birthPlace, school_id, college, major, password)
stuList.append(new_stu)
return stuList
"""
删除指定学号的学生的信息:
在遍历表格的时候,判断当前行是不是要删除的学生?
"""
def delete_byID(self, sheet_name, school_id):
work_sheet = self.__file[sheet_name]
max_row_number = work_sheet.max_row
for i in range(2, max_row_number+1):
# 取出当前行学生的学号
tmp_id = str(work_sheet.cell(i, 5).value)
if tmp_id == school_id:
print("删除第",i,"行")
work_sheet.delete_rows(i)
else:
continue
# 删除某一行只是在缓冲区中删除了,如果要持久删除需要持久保存
self.__file.save(self.__file_name)
"""
更新学生的信息,允许老师修改的信息有:学院、专业
"""
def update_by(self, sheet_name, school_id, new_stu):
work_sheet = self.__file[sheet_name]
max_row_number = work_sheet.max_row
max_col_number = work_sheet.max_column
for i in range(2, max_row_number+1):
tmp_id = str(work_sheet.cell(i, 5).value)
if tmp_id == school_id:
# new_stu是一个字典结构
print("new_stu[’学院’] = ", new_stu["学院"])
work_sheet.cell(i, 6).value = new_stu["学院"]
work_sheet.cell(i, 7).value = new_stu["专业"]
else:
continue
# 保存修改结果
self.__file.save(self.__file_name)
"""
添加一个新学生的信息
"""
def add_new_stu(self, sheet_name, new_stu):
work_sheet = self.__file[sheet_name]
max_row_number = work_sheet.max_row
work_sheet.cell(max_row_number+1, 1).value = new_stu["姓名"]
work_sheet.cell(max_row_number+1, 2).value = new_stu["年龄"]
work_sheet.cell(max_row_number+1, 3).value = new_stu["性别"]
work_sheet.cell(max_row_number+1, 4).value = new_stu["籍贯"]
work_sheet.cell(max_row_number+1, 5).value = new_stu["学号"]
work_sheet.cell(max_row_number+1, 6).value = new_stu["学院"]
work_sheet.cell(max_row_number+1, 7).value = new_stu["专业"]
work_sheet.cell(max_row_number+1, 8).value = new_stu["密码"]
self.__file.save(self.__file_name)
if __name__==’__main__’:
excel_operate = ExcelOperate("stuLists.xlsx")
new_stu = {
"姓名": "李四",
"年龄": 23,
"性别": "男",
"籍贯": "上海",
"学号": "10002",
"学院": "计算机学院",
"专业": "电子科学与技术",
"密码": "1"
}
excel_operate.add_new_stu("stuLists", new_stu)
上面只演示测试了一种功能添加新学生信息,结果如下图所示:
添加前stuLists.xlsx中的内容如下:

FileOperate测试数据
使用python FileOperate.py运行,添加后的结果如下:

FileOperate.py测试结果
其他功能已经经过测试,这里就不再演示了。有兴趣的人可以自行跑一下。
关于这个系统的开发今天就先只介绍到这里,在下一篇文章中会介绍如何用PyQt5编写系统界面,敬请期待。