• 第四章作业 员工信息增删改查


    现要求你写一个简单的员工信息增删改查程序,需求如下:

    当然此表你在文件存储时可以这样表示

    1,Alex Li,22,13651054608,IT,2013‐04‐01

    2,Jack Wang,28,13451024608,HR,2015‐01‐07

    3,Rain Wang,21,13451054608,IT,2017‐04‐01

    4,Mack Qiao,44,15653354208,Sales,2016‐02‐01

    5,Rachel Chen,23,13351024606,IT,2013‐03‐16

    6,Eric Liu,19,18531054602,Marketing,2012‐12‐01

    7,Chao Zhang,21,13235324334,Administration,2011‐08‐08

    8,Kevin Chen,22,13151054603,Sales,2013‐04‐01

    9,Shit Wen,20,13351024602,IT,2017‐07‐03

    10,Shanshan Du,26,13698424612,Operation,2017‐07‐02

    1.可进行模糊查询,语法至少支持下面3种查询语法:

    find name,age from staff_table where age > 22

    find * from staff_table where dept = "IT"

    find * from staff_table where enroll_date like "2013"

    2.可创建新员工纪录,以phone做唯一键(即不允许表里有手机号重复的情况),staff_id需自增

    语法: add staff_table Alex Li,25,134435344,IT,2015‐10‐29

    3.可删除指定员工信息纪录,输入员工id,即可删除

    语法: del from staff where id=3 

    4.可修改员工信息,语法如下:

    把所有dept=IT的纪录的dept改成Market:UPDATE staff_table SET dept="Market" WHERE dept = "IT" 

     把name=Alex Li的纪录的年龄改成25 5:UPDATE staff_table SET age=25 WHERE name = "Alex Li".

    以上每条语名执行完毕后,要显示这条语句影响了多少条纪录。 比如查询语句 就显示 查询出了多少条、 修改语句就显示修改了多少条等。 * 注意:以上需求,要充分使用函数,请尽你的最大限度来减少重复代码!*

    import os
    
    COLUMN = ["id", "name", "age", "phone", "dept", "enroll_date"]
    
    
    def open_file():
        f = open(file="员工信息增删改查", mode="r+", encoding="utf-8")
        data = f.readlines()
        staff_table = {"id": [], "name": [], "age": [], "phone": [], "dept": [], "enroll_date": []}
        for line in data:
            line = line.strip()
            new_list = line.split(",")
            staff_table["id"].append(new_list[0])
            staff_table["name"].append(new_list[1])
            staff_table["age"].append(new_list[2])
            staff_table["phone"].append(new_list[3])
            staff_table["dept"].append(new_list[4])
            staff_table["enroll_date"].append(new_list[5])
        f.close()
        return staff_table
    
    
    STAFF_DATA = open_file()
    
    
    def save_file():
        f = open(file="员工信息增删改查.new", mode="w", encoding="utf-8")
        for index, staff_id in enumerate(STAFF_DATA["id"]):
            row = []
            for col in COLUMN:
                row.append(STAFF_DATA[col][index])
                s = ",".join(row)
            f.write("%s
    " % s)
        f.close()
    
        os.replace("员工信息增删改查.new", "员工信息增删改查")
    
    
    def find_syntax(match_record, clause):
        """
        :param match_record:eg. match_record
        :param clause: eg.clause = find name,age from staff_table where age >22
        :return:
        """
        filter = clause.split("from")[0][4:].split(",")    # clause.split("from")=["find name,age","staff_table where age >22"]
        filter_cols = [i.strip() for i in filter]  # filter_cols = ["name", "age"]
        if "*" in filter_cols[0]:
            print(match_record)
        else:
            reformate_match_record = []
            for row in match_record:  # 在match_record 里循环各列
                filter_vals = []
                for col in filter_cols:    # col 在COLUMN的index和在match_record里一样的,先找到其在COLUMN的index
                    col_index = COLUMN.index(col)
                    filter_vals.append(row[col_index])
                reformate_match_record.append(filter_vals)
            print(reformate_match_record)
        print("查询出%s条记录" % len(match_record))
    
    
    def add_syntax(match_record, clause):
        """
        :param match_record:eg.match_record
        :param clause:add staff_table Alex Li,25,134435344,IT,2015‐10‐29
        :return:
        """
        filter = clause.split("staff_table")
        match_record = filter[-1].split(",")
        if match_record[2] not in STAFF_DATA["phone"]:
            i = int(STAFF_DATA["id"][-1]) + 1
            new_staff_data = [str(i)]
            for staff_id in match_record:
                new_staff_data.append(staff_id)
            for index, col in enumerate(COLUMN):
                STAFF_DATA[col].append(new_staff_data[index])
            save_file()
        else:
            print("phone输入有误,请重新输入")
    
    
    def del_syntax(match_record, clause):
        """
        :param match_record:eg.match_record,id=3的数据
        :param clause:ed.del from staff_table
        :return:
        """
        for match_row in match_record:
            staff_id = match_row[0]  # id那一列的所有元素,通过元素找到在STAFF_DATA中对应的index值
            staff_id_index = STAFF_DATA['id'].index(staff_id)
            for col in COLUMN:
                STAFF_DATA[col].pop(staff_id_index)
        save_file()
        print("删除了%s条数据" % len(match_record))
    
    
    def update_syntax(match_record, clause):
        """
        :param match_record:eg.match_record,所有dept=IT的匹配数据
        :param clause:eg.UPDATE staff_table set dept= Market
        :return:
        """
        filter = clause.split("set")  # filter = ["update staff_table", "dept=Market"]
        if len(filter) > 1:   # 代表set存在
            col_name, new_val = filter[1].strip().split('=')  # 将"dept=Market"以=转换成列表。col_name=dept,new_val=Market
            for match_row in match_record:
                staff_id = match_row[0]   # id那一列的所有元素,通过元素找到在STAFF_DATA中对应的index值
                staff_id_index = STAFF_DATA['id'].index(staff_id)
                STAFF_DATA[col_name][staff_id_index] = new_val
            save_file()
            print("修改成功了%s条数据" % len(match_record))
    
    
    def op_gt(info, condition_val):
        """
        :param info: age
        :param condition_val: 22
        :return: match_record
        """
        match_record = []
        for index, val in enumerate(STAFF_DATA[info]):   # 在STAFF_DATA里的info项里循环val
            if float(val) > float(condition_val):   # 如果val比22大,找到它的index值,再设法找到对应的其他信息
                record = []
                for col in COLUMN:    # 在COLUMN里循环各个参数
                    record.append(STAFF_DATA[col][index])    # 将STAFF_DATA中col里和val的index相同的参数提取出来
                match_record.append(record)    # 所有信息以列表形式记录到match_record里
    
        return match_record
    
    
    def op_lt(info, condition_val):
        match_record = []
        for index, val in enumerate(STAFF_DATA[info]):
            if float(val) < float(condition_val):
                record = []
                for col in COLUMN:
                    record.append(STAFF_DATA[col][index])
                match_record.append(record)
        return match_record
    
    
    def op_eq(info, condition_val):
        match_record = []
        for index, val in enumerate(STAFF_DATA[info]):
            if val == condition_val:
                print(val)
                record = []
                for col in COLUMN:
                    record.append(STAFF_DATA[col][index])
                match_record.append(record)
        return match_record
    
    
    def op_like(info, condition_val):
        match_record = []
        for index, val in enumerate(STAFF_DATA[info]):
            if condition_val in val:
                print(val)
                record = []
                for col in COLUMN:
                    record.append(STAFF_DATA[col][index])
                match_record.append(record)
        return match_record
    
    
    def where(condition):
        """
        :param condition: age>22
        :return: match_data
        """
        operators = {">": op_gt,
                     "<": op_lt,
                     "=": op_eq,
                     "like": op_like}
        for op_key, op_func in operators.items():
            if op_key in condition:   # 如果符号在condition里,就跳到相对应的函数
                info, val = condition.split(op_key)    # info=age,val=22
                match_data = op_func(info.strip(), val.strip())   # 跳到对应的函数
                return match_data
                # print(match_data)
        else:
            print("输入有误,请输入find/add/del/update from staff_table where caulse >/</=/like condtion")
    
    
    def syntax_analyse(user_input):
        syntax_analyse = {"find": find_syntax,
                          "add": add_syntax,
                          "del": del_syntax,
                          "update": update_syntax
                          }
        if user_input.split()[0] in ('find', 'add', 'del', 'update'):
            if "where" in user_input:   # where在输入的语句中,则以where为分割,将user_input转换成列表,判断where之后的语句
                clause, condition = user_input.split("where")   # clause = find name,age from staff_table,condition = age>22
                match_record = where(condition)  # 跳到where函数,并返回match_record的值
            else:
                match_record = []
            cmd_action = user_input.split()[0]   # cmd_action = find,add,update,del
            clause = user_input
            cmd_action = user_input.split()[0]
            if cmd_action in syntax_analyse:
                syntax_analyse[cmd_action](match_record, clause)
    
        else:
            print("输入有误,请输入find/add/del/update from staff_table where caulse >/</=/like condtion")
    
    
    while True:
        user_input = input("staff_data").strip()
        if not user_input:    # 如果用户输入的不为空就进入语法分析
            continue
        syntax_analyse(user_input.strip())       # 跳转到语法分析函数
  • 相关阅读:
    什么是Referer?Referer的作用?空Referer是怎么回事?
    http状态码301和302详解及区别——辛酸的探索之路
    linux下redis的安装、启动、关闭和卸载
    Ubuntu下的redis安装过程
    apt-get build-dep命令详解
    apt 和 apt-get的区别
    Cortex-M3 入门指南(三):时钟总线与复位时钟控制器
    objdump命令解析
    ubuntu gcc 安装 使用
    你知道 GNU Binutils 吗?【binutils】
  • 原文地址:https://www.cnblogs.com/51zf/p/9185260.html
Copyright © 2020-2023  润新知