python - 一个简单的员工信息增删改查程序

≡放荡痞女 提交于 2019-12-06 00:12:31

作业

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

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

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.可修改员工信息,语法如下:

UPDATE staff_table SET dept="Market" WHERE  dept = "IT" 把所有dept=IT的纪录的dept改成Market
UPDATE staff_table SET age=25 WHERE  name = "Alex Li"  把name=Alex Li的纪录的年龄改成25

5.以上每条语名执行完毕后,要显示这条语句影响了多少条纪录。 比如查询语句 就显示 查询出了多少条、修改语句就显示修改了多少条等。

注意:以上需求,要充分使用函数,请尽你的最大限度来减少重复代码!

代码如下:

from tabulate import tabulate
import os

DB_FILE = "staff.db"
COLUMNS = ['id','name','age','phone','dept','enrolled_date']


def print_log(msg,log_type="info"):
    if log_type == 'info':
        print("\033[32;1m%s\033[0m"%msg)
    elif log_type == 'error':
        print("\033[31;1m%s\033[0m"%msg)


def load_db(db_file):
    """
    第三步:加载员工信息表并转成指定的格式
    :param db_file:
    :return:
    """
    date = {}
    for i in COLUMNS:
        date[i] = []

    f = open(db_file,"r")
    for line in f:
        staff_id,name,age,phone,dept,enrolled_date = line.split(",")
        date['id'].append(staff_id)
        date['name'].append(name)
        date['age'].append(age)
        date['phone'].append(phone)
        date['dept'].append(dept)
        date['enrolled_date'].append(enrolled_date)
    return date

def save_db():
    """把内存数据存回硬盘"""
    f = open("%s.new"%DB_FILE,"w",encoding="utf-8")
    for index,staff_id in enumerate(STAFF_DATE['id']):
        row = []
        for col in COLUMNS:
            row.append( STAFF_DATE[col][index] )
        f.write( ",".join(row) )
    f.close()

    os.rename("%s.new"%DB_FILE,DB_FILE)

STAFF_DATE = load_db(DB_FILE) #程序一启动就执行


def op_gt(column,condtion_val):
    """

    :param column: eg: age
    :param condtion_val: eg: 22
    :return: [[id,name,age]...]
    """
    matched_records = []
    for index,val in enumerate(STAFF_DATE[column]):  #"age":[22,23...]
        if float(val) > float(condtion_val):  #匹配上了
            # print("match",val)
            record = []
            for col in COLUMNS:
                record.append(STAFF_DATE[col][index])
            matched_records.append(record)
    # print("matched_records",matched_records)
    return matched_records


def op_lt(column,condtion_val):

    matched_records = []
    for index, val in enumerate(STAFF_DATE[column]):  # "age":[22,23...]
        if float(val) < float(condtion_val):  # 匹配上了
            # print("match",val)
            record = []
            for col in COLUMNS:
                record.append(STAFF_DATE[col][index])
            matched_records.append(record)
    # print("matched_records",matched_records)
    return matched_records


def op_eq(column,condtion_val):
    matched_records = []
    for index, val in enumerate(STAFF_DATE[column]):  # "age":[22,23...]
        if val == condtion_val:  # 匹配上了
            # print("match",val)
            record = []
            for col in COLUMNS:
                record.append(STAFF_DATE[col][index])
            matched_records.append(record)
    # print("matched_records",matched_records)
    return matched_records

def op_like(column,condtion_val):
    matched_records = []
    for index, val in enumerate(STAFF_DATE[column]):  # "age":[22,23...]
        if condtion_val in val:  # 匹配上了

            record = []
            for col in COLUMNS:
                record.append(STAFF_DATE[col][index])
            matched_records.append(record)

    return matched_records

def syntax_where(clause):
    """
    解析where条件,并过滤数据
    :param clause: eg: age>22
    :return:
    """
    operatoes = {
        '>':op_gt,
        '<':op_lt,
        '=':op_eq,
        'like':op_like
    }
    for op_key,op_func in operatoes.items():
        if op_key in clause:
            # print("clause:",clause)
            column,var = clause.split(op_key)
            # print(column,var)
            matched_date = op_func(column.strip(),var.strip())  #真正的查询数据去啦
            # print(matched_date)
            # break
            return matched_date
    else:  #只有在for执行完成,且中间没有被break的情况下,才执行
           #没匹配上任何的条件公式
         print_log("语法错误:where条件只能支持[>,<,=,like]",'error')

def syntax_find(data_set,query_clause):
    """
    解析查询语句并从data_set中打印指定列
    :param data_set:  eg: [['1','','',''''],...]
    :param query_clause: eg:find name,age from staff_date
    :return:
    """
    filter_cols_tmp = query_clause.split('from')[0][4:].split(',')
    filter_cols = [i.strip() for i in filter_cols_tmp]   #干净的columns
    # print(filter_cols)
    if '*' in filter_cols[0]:
        print(tabulate(data_set, headers=COLUMNS, tablefmt="grid"))
    else:
        reformat_data_set = []
        for row in data_set:
            filtered_vals = [] #把要打印的字段放到这个列表里
            for col in filter_cols:
                col_index = COLUMNS.index(col)  #拿到列的索引,以此取出每条记录里对应索引的值
                filtered_vals.append(row[col_index])
            reformat_data_set.append(filtered_vals)
        # print(reformat_data_set)
        # for r in reformat_data_set:
        #     print(r)
        print(tabulate(reformat_data_set,headers=filter_cols,tablefmt="grid"))
    print_log("匹配到%s条数据!" % len(data_set))

def syntax_delete(data_set,query_clause):
    pass

def syntax_update(data_set,query_clause):
    """

    :param data_set: # eg: [['1','','',''''],...]
    :param query_clause:  eg:update staff_table set age=25
    :return:
    """
    formula_raw = query_clause.split('set')
    if len(formula_raw) > 1:  #set关键字
        col_name,new_val = formula_raw[1].strip().split('=') #age=25
        #循环data_set,取到每条记录的id,拿着这个idSTAFF_DATA['id']找对应id的索引
        #再拿这个索引去STAFF_DATA['age']列表里,改对应索引的值
        # col_index = COLUMNS.index(col_name)
        for matched_row in data_set:
            staff_id = matched_row[0]
            staff_id_index = STAFF_DATE['id'].index(staff_id)
            STAFF_DATE[col_name][staff_id_index] = new_val
        print(STAFF_DATE)
        save_db()  #把修改后的数据刷到硬盘上
        print_log("成功修改了%s条数据!"% len(data_set))

    else:
        print_log("语法错误:未检测到set关键字!",'error')



def syntax_add(data_set,query_clause):
    pass


def syntax_parser(cmd):
    """
    第二步:解析语句,并执行
    1.
    :param cmd:
    :return:
    """
    syntax_list = {
        'find':syntax_find,
        'del': syntax_delete,
        'update': syntax_update,
        'add':syntax_add,

    }

    if cmd.split()[0] in ('find','add','del','update'):
        if 'where' in cmd:
            query_clause,where_clause = cmd.split("where")
            print(query_clause,where_clause)
            matched_records = syntax_where(where_clause)
        else:
            matched_records = []
            for index,staff_id in enumerate(STAFF_DATE['id']):
                record = []
                for col in COLUMNS:
                    record.append(STAFF_DATE[col][index])
                matched_records.append(record)
            query_clause = cmd

        cmd_action = cmd.split()[0]
        if cmd_action in syntax_list:
            syntax_list[cmd_action](matched_records,query_clause)
        # else:
        #     print_log("语法错误:只支持find,add,del,update指令,not %s"%cmd_action,'error')

    else:          #31就是红色,32就是绿色
        print_log("语法错误:\n[find\\add\del\\update] [column1,..] from [staff_date] [where] [column][>,..][condtion]\n",'error')


def main():
    """
    第一步:让用户输入语句,并执行
    :return:
    """
    while True:
        cmd = input("[staff_db]:").strip()
        if not cmd: continue
        syntax_parser(cmd.strip())

main() #start program
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!