目录
正式代码如下:
student.py——负责保存学生的单条信息
student_manage.py——负责管理学生信息,对学生信息进行操作
main.py——程序的入口文件
实现了学生信息的增、删、改、查、从文件读入、写入文件
发现了python的一个容易让程序员写出bug的地方:
假如file=open('students.txt', 'r')
当使用file.readlines()方法从文件读入数据时,不管程序怎么写,只要用一次file.readlines(),那么在之后使用了file.readlines()时返回的结果都会变成空列表!
如图所示,文本中已经存了四行数据
在我使用如下代码先输出file.readlines()返回的列表长度后,再次使用file.readlines()却返回了一个空列表
print('len:',len(file.readlines()))
print(file.readlines())
print('len:',len(file.readlines()))
所以,恰当的使用方法应该是先令contents=file.readlines(),之后的所有操作都对contents进行。
正式代码如下:
student.py——负责保存学生的单条信息
'''
负责保存单条学生信息
'''
class StudentInfo(object):
def __init__(self, stu_num, stu_name, stu_sex, stu_age):
self.stu_num = stu_num
self.stu_name = stu_name
self.stu_sex = stu_sex
self.stu_age = stu_age
def __str__(self): # 返回值必须为(空)字符串
return self.stu_num.ljust(14) + self.stu_name.ljust(7) + self.stu_sex.ljust(3) + self.stu_age.ljust(3)
# 测试
if __name__ == '__main__': # 如果被动运行,__name__==模块名
stu = StudentInfo('311166000781', '李师傅', '男', '21')
print(stu)
student_manage.py——负责管理学生信息,对学生信息进行操作
'''
负责管理学生信息,对学生信息进行操作
'''
from student import StudentInfo
import sys
class StudentManage(object):
def __init__(self):
self.students = {} # 保存学生信息
def start(self): # 必须定义为公有方法,否则无法外部调用
while True:
self.__showMenu()
select_id = input("请输入数字:")
n = int(select_id)
if n <= 8 and n >= 0:
self.__selectFun(select_id)
else:
print('请重新输入有效数字!')
# 定义私有方法
def __showMenu(self):
print('*' * 30)
print('1.显示学生信息')
print('2.查找学生信息')
print('3.添加学生信息')
print('4.修改学生信息')
print('5.统计学生信息')
print('6.删除学生信息')
print('7.将学生信息写入文件')
print('8.从文件读入学生信息')
print('0.退出系统')
print('*' * 30)
# 选择功能
def __selectFun(self, select_id):
select_fun = {'1': self.__showAllStu,
'2': self.__searchStu,
'3': self.__addStu,
'4': self.__modifyStu,
'5': self.__countStu,
'6': self.__delStu,
'7': self.__writeStu,
'8': self.__readStu,
'0': sys.exit}
if select_id == '2' or select_id == '4' or select_id == '6':
stu_num = input('请输入学号:')
select_fun[select_id](stu_num)
else:
select_fun[select_id]()
# 添加学生信息
def __addStu(self):
stu_num = input('请输入学号:')
stu_name = input('请输入姓名:')
stu_sex = input('请输入性别:')
stu_age = input('请输入年龄:')
stu = StudentInfo(stu_num, stu_name, stu_sex, stu_age)
self.students[stu_num] = stu
# 查找学生信息
def __searchStu(self, stu_num):
for k in self.students:
if k == stu_num:
self.__showStu(k)
return k
else:
print('查无此人!')
return None
# 修改学生信息
def __modifyStu(self, stu_num):
print('正在查找>>>')
k = self.__searchStu(stu_num)
if k:
stu = self.students[k]
n = input('请输入修改后的学号(无需修改输入-1):')
stu.stu_num = self.__modifyJudge(n, stu.stu_num)
n = input('请输入修改后姓名(无需修改输入-1):')
stu.stu_name = self.__modifyJudge(n, stu.stu_name)
n = input('请输入修改后性别(无需修改输入-1):')
stu.stu_sex = self.__modifyJudge(n, stu.stu_sex)
n = input('请输入修改后年龄(无需修改输入-1):')
stu.stu_age = self.__modifyJudge(n, stu.stu_age)
print('修改完毕!')
# 修改辅助判断
def __modifyJudge(self, n, value):
if n == '-1':
return value
else:
return n
# 统计学生信息
def __countStu(self):
male = 0
female = 0
age = {}
for v in self.students.values():
if v.stu_sex == '男':
male += 1
else:
female += 1
if v.stu_age in age:
age[v.stu_age] += 1
else:
age[v.stu_age] = 1
print(f'学生共有{len(self.students)}名,其中男生共有{male}名,女生共有{female}名')
for k, v in age.items():
print(f'| 年龄为{k}的同学共有{v}名 |')
# 删除学生信息
def __delStu(self, stu_num):
k = self.__searchStu(stu_num)
if k:
self.students.pop(k)
print('删除成功!')
# 显示单条信息
def __showStu(self, stu_num):
print('| ' + str(self.students[stu_num]) + ' |')
# 显示全部学生信息
def __showAllStu(self):
if self.students:
for k in self.students:
self.__showStu(k)
else:
print('当前无学生信息,请添加...')
# 将学生信息写入文件
def __writeStu(self):
if not self.students:
print('还未录入学生信息!请先录入后再次尝试')
else:
file = open('students.txt', 'w')
for stu in self.students.values():
file.writelines(str(stu) + '\n')
file.close()
print('写入完毕!')
# 从文件读入学生信息
def __readStu(self):
file = None
try:
file = open('students.txt', 'r')
except Exception as e:
print('文件不存在,请检查后重试', e)
else:
contents=file.readlines()
i = 1
for content in contents:
content = content.split()
stu = StudentInfo(content[0], content[1], content[2], content[3]) # 实例化一个对象
self.students[content[0]] = stu # 添加到存放学生信息的字典中
print(f'第{i}名学生信息录入完毕>>>')
i+=1
print(f'{len(contents)}名学生信息从文件录入完毕!')
finally:
if file != None:
file.close()
main.py——程序的入口文件
'''
主程序文件,实现程序的入口
'''
from student_manage import *
if __name__ == '__main__':
stu = StudentManage()
stu.start()
|