目录

一、项目需求

二、分析

        学生类:

        管理系统类:

        数据文件:

三、优化

四、项目方法构造

学生类:

管理系统类:

                1、载入数据

                2、导出数据

                3、打印目录

                4、增加学生信息

                5、删除某个学生信息

                6、修改某个学生信息

                7、查询全部学生

                8、查询单个学生

                9、开始运行函数

五、运行截图

添加学生:

修改学生:

删除学生:

六、案例代码

七、总结


一、项目需求

        基本需求:完成系统的增、删、改、查功能

        增加需求:1.使用面向对象的思想开发;2.把学生信息存储到外部文件中


二、分析

        学生类:

                属性:

                        包含三个参数姓名(name)、年龄(age)、电话(tel);其中年龄age为int类型

                方法:

                        __init__ 学生类的初始化方法

        管理系统类:

                属性:

                        学生列表 user_list

                方法:

                        1.__init__ 管理系统初始化方法

                        2.增加学生

                        3.删除学生

                        4.修改学生

                        5.查询全部学生

                        6.查询单个学生

                        7.加载数据

                        8.保存数据

                       9.打印目录方法

        数据文件:

                文件名:stu_data.txt


三、优化

        对于本项目,学生的信息在文件中存储是以列表套字典的格式进行存储,具体格式如图:

python实现查找学生姓名打印学生信息 python查询学生信息简易版_python

        而在学生列表中则是以实例对象的方式进行存储,以减少内存占用,格式如图:


四、项目方法构造

学生类:

class Student(object):
    def __init__(self, _name='', _age=0, _tel=''):
        self.name = _name
        self.age = _age
        self.tel = _tel
        self.stu_dict = {'name': self.name, 'age': self.age, 'tel': self.tel}

           分析:学生类中使用 __init__ 方法定义三个学生属性参数;stu_dict 用来把学生对象转换成字典的形式保存

管理系统类:

                1、载入数据

def data_into(self):
    """载入数据"""
    # 判断文件是否存在 若不存在则退出
    if not os.path.exists('./stu_data.txt'):
         return
    # 如果存在则对数据进行提取、载入,并以实例对象的形式保存到user_liast中
    with open('stu_data.txt', 'r') as f:
        # data_list 为临时变量, 临时保存数据列表
        data_list = eval(f.read())
        if data_list:
            for each in data_list:
                self.user_list.append(Student(each['name'], each['age'], each['tel']))

                2、导出数据

def save_data(self):
        """导出数据"""
        with open('stu_data.txt', 'w') as f:
            data_list = []
            # 把类对象的字典形式提取出来并转为str形式保存
            # data_list为临时变量,临时保存列表
            for each in self.user_list:
                data_list.append(each.stu_dict)
            f.write(str(data_list))

                3、打印目录

@staticmethod
    def show_menu():
        print('-' * 20)
        print('= 1.  添加学生')
        print('= 2.  删除学生')
        print('= 3.  修改学生')
        print('= 4.  查询全部学生')
        print('= 5.  查询某个学生')
        print('= 6.  保存信息')
        print('= 7.  退出系统')
        print('-' * 20)

                4、增加学生信息

def add_stu(self):
        """添加学生"""
        name = input('请输入要添加学生的姓名: ')
        # 如果学生姓名重复则重新输入
        while True:
            for each in self.user_list:
                if name == each.name:
                    print('该学生已存在')
                    name = input('请重新输入: ')
                    break
            else:
                break
        age = int(input('请输入学生年龄: '))
        tel = input('请输入学生电话: ')
        # 在user_list中追加新的学生实例对象
        self.user_list.append(Student(name, age, tel))
        print('添加成功')

                5、删除某个学生信息

def del_stu(self):
        """删除学生信息"""
        name = input('请输入要删除的学生姓名: ')
        # 循环判断学生是否存在
        for i, each in enumerate(self.user_list):
            if each.name == name:
                self.user_list.pop(i)
                print('删除成功!')
                break
        else:
            print('查无此人!')

                6、修改某个学生信息

def update_stu(self):
        """修改某个学生"""
        name = input('请输入要修改的学生姓名: ')
        for i, each in enumerate(self.user_list):
            if each.name == name:
                # 使用 while True 保证修改后的学生不重复
                while True:
                    name = input('请输入修改后的姓名: ')
                    for stu in self.user_list:
                        if stu.name == name:
                            print('该学生已存在, 请重新输入')
                            break
                    else:
                        break
                age = int(input('输入修改后的年龄: '))
                tel = input('输入修改后的电话: ')
                self.user_list[i] = Student(name, age, tel)
                print('修改成功')
                break
        else:
            print('查无此人!')

                7、查询全部学生

def show_all_stu(self):
        """查询所有学生"""
        print('序号\t\t\t姓名\t\t\t年龄\t\t\t电话')
        for i, each in enumerate(self.user_list):
            print(f"{i+1}\t\t\t{each.name}\t\t{each.age}\t\t\t{each.tel}")

                8、查询单个学生

def show_all_stu(self):
        """查询所有学生"""
        # 如果存在学生信息则打印,若没有信息则提示为空
        if self.user_list:
            print('序号\t\t\t姓名\t\t\t年龄\t\t\t电话')
            for i, each in enumerate(self.user_list):
                print(f"{i + 1}\t\t\t{each.name}\t\t\t{each.age}\t\t\t{each.tel}")
        else:
            print('没有学生信息!')

                9、开始运行函数

def start(self):
        # 在系统开始时加载数据
        self.data_into()
        # 通过死循环来保证程序不主动退出
        while True:
            System.show_menu()

            choose = input('请输入操作: ')

            if choose == '1':
                self.add_stu()
            elif choose == '2':
                self.del_stu()
            elif choose == '3':
                self.update_stu()
            elif choose == '4':
                self.show_all_stu()
            elif choose == '5':
                self.show_one_stu()
            elif choose == '6':
                print('保存成功')
                self.save_data()
            # 如果退出前不保存,不会自动保存数据
            elif choose == '7':
                print('退出系统...')
                break
            else:
                print('输入错误, 请重新输入...')

五、运行截图

添加学生:

python实现查找学生姓名打印学生信息 python查询学生信息简易版_数据_02


修改学生:


删除学生:

python实现查找学生姓名打印学生信息 python查询学生信息简易版_导出数据_03


六、案例代码

import os

class Student(object):
    def __init__(self, _name='', _age=0, _tel=''):
        self.name = _name
        self.age = _age
        self.tel = _tel
        self.stu_dict = {'name': self.name, 'age': self.age, 'tel': self.tel}


class System(object):
    def __init__(self):
        self.user_list = []

    @staticmethod
    def show_menu():
        print('-' * 20)
        print('= 1.  添加学生')
        print('= 2.  删除学生')
        print('= 3.  修改学生')
        print('= 4.  查询全部学生')
        print('= 5.  查询某个学生')
        print('= 6.  保存信息')
        print('= 7.  退出系统')
        print('-' * 20)

    def add_stu(self):
        """添加学生"""
        name = input('请输入要添加学生的姓名: ')
        # 如果学生姓名重复则重新输入
        while True:
            for each in self.user_list:
                if name == each.name:
                    print('该学生已存在')
                    name = input('请重新输入: ')
                    break
            else:
                break
        age = int(input('请输入学生年龄: '))
        tel = input('请输入学生电话: ')
        # 在user_list中添加新的学生实例对象
        self.user_list.append(Student(name, age, tel))
        print('添加成功')

    # 2, 删除
    def del_stu(self):
        """删除学生信息"""
        name = input('请输入要删除的学生姓名: ')
        # 循环判断学生是否存在
        for i, each in enumerate(self.user_list):
            if each.name == name:
                self.user_list.pop(i)
                print('删除成功!')
                break
        else:
            print('查无此人!')

    # 3. 修改
    def update_stu(self):
        """修改某个学生"""
        name = input('请输入要修改的学生姓名: ')
        for i, each in enumerate(self.user_list):
            if each.name == name:
                # 使用 while True 保证修改后的学生不重复
                while True:
                    name = input('请输入修改后的姓名: ')
                    for stu in self.user_list:
                        if stu.name == name:
                            print('该学生已存在, 请重新输入')
                            break
                    else:
                        break
                age = int(input('输入修改后的年龄: '))
                tel = input('输入修改后的电话: ')
                self.user_list[i] = Student(name, age, tel)
                print('修改成功')
                break
        else:
            print('查无此人!')

    # 4. 查询所有
    def show_all_stu(self):
        """查询所有学生"""
        # 如果存在学生信息则打印,若没有信息则提示为空
        if self.user_list:
            print('序号\t\t\t姓名\t\t\t年龄\t\t\t电话')
            for i, each in enumerate(self.user_list):
                print(f"{i + 1}\t\t\t{each.name}\t\t\t{each.age}\t\t\t{each.tel}")
        else:
            print('没有学生信息!')

    # 5. 查询某个
    def show_one_stu(self):
        """查询单个学生"""
        name = input('输入要查询的学生姓名: ')
        for each in self.user_list:
            if each.name == name:
                print(f"{each.name}\t\t{each.age}\t\t{each.tel}")
                break
        else:
            print('查无此人')

    def data_into(self):
        """载入数据"""
        # 判断文件是否存在 若不存在则退出
        if not os.path.exists('./stu_data.txt'):
            return
        # 如果存在则对数据进行提取、载入,并以实例对象的形式保存到user_liast中
        with open('stu_data.txt', 'r') as f:
            data_list = eval(f.read())
            for each in data_list:
                self.user_list.append(Student(each['name'], each['age'], each['tel']))
                # self.user_list = [Student(each['name'], each['age'], each['tel']) for each in data_list]

    def save_data(self):
        """导出数据"""
        with open('stu_data.txt', 'w') as f:
            data_list = []
            # 把类对象的字典形式提取出来并转为str形式保存
            # data_list为临时变量,临时保存列表
            for each in self.user_list:
                data_list.append(each.stu_dict)
            f.write(str(data_list))

    def start(self):
        # 在系统开始时加载数据
        self.data_into()
        # 通过死循环来保证程序不主动退出
        while True:
            System.show_menu()

            choose = input('请输入操作: ')

            if choose == '1':
                self.add_stu()
            elif choose == '2':
                self.del_stu()
            elif choose == '3':
                self.update_stu()
            elif choose == '4':
                self.show_all_stu()
            elif choose == '5':
                self.show_one_stu()
            elif choose == '6':
                print('保存成功')
                self.save_data()
            # 如果退出前不保存,不会自动保存数据
            elif choose == '7':
                print('退出系统...')
                break
            else:
                print('输入错误, 请重新输入...')


manager = System()
manager.start()

七、总结

        1、在管理系统类中要用Student实例对象来当学生信息并保存到学生列表user_list 中。

        2、载入数据时要判断是否为空,否则用 r 读取会报错。

        3、保存数据要先将学生列表 user_list 中的数据变为字典格式的数据,再用 w 模式保存到文件中,注意保存的格式为 字符串str 型。

        4、这个系统是把学生姓名当作唯一不可改变的变量来使用,也可以根据实际情况来选择唯一变量;唯一变量是判断两个数据是否重复的唯一标准。