作业
现要求你写一个简单的员工信息增删改查程序,需求如下:
当然此表你在文件存储时可以这样表示
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,拿着这个id到STAFF_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
来源:CSDN
作者:不才一首歌
链接:https://blog.csdn.net/Albert_ycl/article/details/80144796