python学生管理系统(文件读写)

# 导包
import time
import os  # Operating System: 系统模块.

"""

学生的属性如下:
    姓名, 性别, 年龄, 联系方式, 描述信息
"""

# 1. 定义学生类.
class Student(object):
    # 2. 初始化学生信息
    def __init__(self, name, gender, age, mobile, des):
        """
        该魔法方法用于 初始化 学生的属性信息.
        :param name: 姓名
        :param gender: 性别
        :param age: 年龄
        :param mobile: 手机号
        :param des: 描述信息
        """
        self.name = name
        self.gender = gender
        self.age = age
        self.mobile = mobile
        self.des = des

    # 3. 打印学生信息.
    def __str__(self):
        # print(__name__)
        return f'姓名: {self.name}, 性别: {self.gender}, 年龄: {self.age}, 手机号: {self.mobile}, 描述信息: {self.des}'
        # return '姓名: %s, 性别: %s, 年龄: %d, 手机号: %s, 描述信息: %s' % (self.name, self.gender, self.age, self.mobile, self.des)

"""

学生管理系统类 StudentCms
    属性:
        stu_info = [{学生信息}, {学生信息}...]
        即: stu_info = [学生对象, 学生对象...]
    行为: 函数
        __init__()      # 初始化属性信息
        show_view()     # 打印提示信息, 无需使用self对象, 所以设置为: 静态方法.
        add_student()   # 添加学生信息
        del_student()   # 删除学生信息
        update_student()   # 修改学生信息
        search_one_student()   # 查询单个学生信息
        search_all_student()   # 查询所有学生信息
        save_student()   # 保存学生信息 => 文件中, 存档.
        load_student()   # 从文件中 => 学生信息, 读档.
        start()   # 表示整体的业务逻辑 => 框架
"""
# 1. 定义学生管理系统类.
class StudentCms(object):
    # 2. 定义初始化属性.
    def __init__(self):
        # 格式: [{学生信息}, {学生信息}...],   即: [学生对象, 学生对象...]
        self.stu_info = []

    # 3. show_view()     # 打印提示信息, 设置为: 静态方法.
    @staticmethod
    def show_view():
        print("*" * 21)
        print("欢迎使用学生管理系统V2.0")
        print("\t1. 添加学生信息")
        print("\t2. 修改学生信息")
        print("\t3. 删除学生信息")
        print("\t4. 查询单个学生信息")
        print("\t5. 查询所有学生信息")
        print("\t6. 保存学生信息")
        print("\t7. 退出系统")
        print("*" * 21)

    # 4. add_student()   # 添加学生信息
    def add_student(self):
        # 4.1 提示用户录入学生信息 并接收.
        name = input('请录入学生的姓名: ')
        gender = input('请录入学生的性别: ')
        age = input('请录入学生的年龄: ')
        mobile = input('请录入学生的手机号: ')
        des = input('请录入学生的描述信息: ')
        # 4.2 将上述的信息封装成 学生对象.
        new_stu = Student(name, gender, age, mobile, des)
        # 4.3 将学生对象添加到列表中.
        self.stu_info.append(new_stu)
        # 4.4 打印提示信息.
        print(f"添加学生 {name} 的信息成功!\n")

    # 5. del_student()   # 删除学生信息
    def del_student(self):
        # 5.1 提示用户录入要删除的学生 姓名.   
        del_name = input('请录入要删除的学生姓名: ')
        # 5.2 遍历学生列表, 获取每个学生信息.
        for stu in self.stu_info:
            # stu: 就是具体的每个学生对象.
            # 5.3 判断当前学生信息, 是否是 要删除的学生.
            if stu.name == del_name:
                # 5.4 走这里, 删除该学生对象即可.
                self.stu_info.remove(stu)
                print(f"删除学生 {del_name} 的信息成功!\n")
                break
        else:
            # 5.5 走这里, 说明没有找到要删除的学生.
            print(f'未找到 {del_name} 学生信息, 请校验后重新操作!\n')

    # 6. update_student()   # 修改学生信息
    def update_student(self):
        # 6.1 提示用户录入要修改的学生 姓名, 并接收.
        update_name = input('请录入要修改的学生姓名: ')
        # 6.2 遍历学生列表, 获取每个学生的信息.
        for stu in self.stu_info:
            # stu: 就是具体的每个学生对象.
            # 6.3 判断当前学生信息, 是否是 要修改的学生.
            if stu.name == update_name:
                # 6.4 走这里, 提示用户, 录入要修改的信息, 并修改当前学生的信息.
                stu.gender = input('请录入新的性别: ')
                stu.age = input('请录入新的年龄: ')
                stu.mobile = input('请录入新的手机号: ')
                stu.des = input('请录入新的描述信息: ')
                # 6.5 提示, 并结束.
                print(f"修改 {update_name} 的信息成功!\n")
                break
        else:
            # 6.6 走这里, 说明没有找到要修改的学生.
            print(f'未找到 {update_name} 学生信息, 请重新操作!\n')

    # 7. search_one_student()   # 查询单个学生信息
    def search_one_student(self):
        # 7.1 提示用户录入要查询的学生 姓名, 并接收.
        search_name = input('请录入要查询的学生姓名: ')
        # 7.2 遍历学生列表, 获取每个学生的信息.
        for stu in self.stu_info:
            # stu: 就是具体的每个学生对象.
            # 7.3 判断当前学生信息, 是否是 要查询的学生.
            if stu.name == search_name:
                # 7.4 走这里, 说明找到了, 打印即可.
                # print(stu, '\n')
                print(stu, end='\n\n')
                break
        else:
            # 7.5 走这里, 说明没有找到要修改的学生.
            print(f'未找到 {search_name} 学生信息, 请重新操作!\n')

    # 8. search_all_student()   # 查询所有学生信息
    def search_all_student(self):
        # 8.1 判断列表中是否有 学生信息.
        if len(self.stu_info) <= 0:
            # 8.2 走这里, 说明暂无学生信息.
            print('暂无学生信息, 请添加后重新查询!\n')
        else:
            # 8.3 走这里, 说明有学生信息, 遍历打印即可.
            for stu in self.stu_info:
                print(stu)
            print()  # 换行, 让格式更加好看.

    # 9. save_student()   # 保存学生信息 => 文件中, 存档.
    def save_student(self):
        # 9.1 把 学生对象列表 => 列表嵌套字典的形式, 即:  [学生对象, 学生对象...]    =>  [{学生信息}, {学生信息}...]
        stu_dict_list = [stu.__dict__ for stu in self.stu_info]
        # 9.2 把上述的学生信息(列表嵌套字典), 写到目的地文件 student.data 文件中.
        with open('./student.data', 'w', encoding='utf-8') as dest_f:  # dest: 目的地
            # 9.3 具体的写的动作.
            # 先把 列表嵌套字典, 转换成 字符串, 再写入到目的地文件中.
            dest_f.write(str(stu_dict_list))
            # 9.4 提示即可.
            print('学生信息存档成功!\n')

    # 10. load_student()   # 从文件中 => 学生信息, 读档.
    def load_student(self):
        # 10.1 判断数据源文件是否存在.
        if os.path.isfile('./student.data'):  # 判断 student.data 必须是 存在的 文件才行.
            # 10.2 走到这里, 说明源文件存在, 读取文件信息即可.
            with open('./student.data', 'r', encoding='utf-8') as src_f:
                # 10.3 具体的读取文件数据的操作.
                # 格式为:  "[{'name': '乔峰', 'gender': '男', 'age': 39, 'mobile': '131', 'des': '丐帮帮主'}, {学生信息}, {学生信息}...]"
                str_list_data = src_f.read()
                # 10.4 判断 字符串的长度是否合法, 如果不合法, 给个默认值.
                if len(str_list_data) <= 0:
                    str_list_data = '[]'
                # 10.5 把上述的 字符串形式的 列表嵌套字典 => 列表嵌套字典 的格式.
                # 格式为: [{'name': '乔峰', 'gender': '男', 'age': 39, 'mobile': '131', 'des': '丐帮帮主'}, {学生信息}, {学生信息}...]
                list_data = eval(str_list_data)  # eval(): 去掉最外边的那组引号, 剩下的是啥就转成什么类型.
                # 10.6 把上述的列表嵌套字典形式的 学生数据 => 学生列表对象, 即: [学生对象, 学生对象...]
                self.stu_info = [Student(**stu_dict) for stu_dict in list_data]
        else:
            # 10.7 走这里, 说明文件不存在, 创建即可.
            # src_f = open('./student.data', 'w', encoding='utf-8')
            # src_f.close()

            # 扩展: 你去查一下 os模块中是否有直接创建文件的函数, 有可以直接使用它来完成需求.
            os.open('./student.data', flags=os.O_CREAT)  # 效果同上.

    # 11. start()   # 表示整体的业务逻辑 => 框架
    def start(self):
        # 11.0 加载学生的信息, 类似于: 读档.
        self.load_student()

        # 11.1 因为是重复操作的, 所以用 while(True) 死循环.
        while True:
            # 11.2 模拟用户等待
            time.sleep(1)  # 1秒
            # 11.3 打印提示信息
            # self.show_view()      # 静态方法, 调用方式1: 对象名.   可以, 但是不推荐.
            StudentCms.show_view()  # 静态方法, 调用方式1: 类名.     推荐

            # 11.4 提示用户录入他/她要操作的编号, 并接收.
            num = input('请录入您要操作的编号: ')
            # 11.5 基于用户录入的编号, 判断, 并进行对应的操作.
            if num == '1':
                # print("1. 添加学生信息")
                self.add_student()
            elif num == '2':
                # print("2. 修改学生信息")
                self.update_student()
            elif num == '3':
                # print("3. 删除学生信息")
                self.del_student()
            elif num == '4':
                # print("4. 查询单个学生信息")
                self.search_one_student()
            elif num == '5':
                # print("5. 查询所有学生信息")
                self.search_all_student()
            elif num == '6':
                # print("6. 保存学生信息")
                self.save_student()
            elif num == '7':
                # 细节: 退出系统, 给一个提示信息.
                result = input('您确定要退出吗, y(退出), 其它(继续) => ')
                if result.lower() == 'y':  # lower()函数: 把字母转成其对应的 小写形式.
                    time.sleep(2)
                    # 细节: 也可以考虑, 在退出之前(就是这里), 再次保存下学生信息.
                    # self.save_student()
                    print('感谢您的使用, 再见!')
                    break
            else:
                print('录入有误, 请重新录入!\n')


# 12. 在main方法中测试.
if __name__ == '__main__':
    stu_cms = StudentCms()
    stu_cms.start()
 

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值