python练习_module02-1-员工信息表
python 操作 员工信息表
- 要求:
-
可进行模糊查询,语法至少支持下面3种:
select name,age from staff_table where age > 22
select * from staff_table where dept = "IT"
select * from staff_table where enroll_date like "2013"查到的信息,打印后,最后面还要显示查到的条数
-
可创建新员工纪录,以phone做唯一键,staff_id需自增
-
可删除指定员工信息纪录,输入员工id,即可删除
-
可修改员工信息,语法如下:
UPDATE staff_table SET dept="Market" WHERE where dept = "IT"
注意:以上需求,要充分使用函数,请尽你的最大限度来减少重复代码 - 达成要求:
- 查询命令的各单词之间可以有任意数量的空格
- 查询时不设定条件(where语句)也可以执行
- 错误信息高亮显示
- 代码:
#! /usr/bin/env python3 # Author:Jailly import pickle,re # 查找 def search(search_condition): res = [] # 储存查找结果 # where条件存在 if search_condition: # 三种条件格式 m1 = re.search(r'age\s+(>|<)\s+(0|([1-9]\d*))', search_condition) m2 = re.search(r''' (?P<category>(staff_id)|(name)|(age)|(phone)|(dept)|(enroll_date)) \s+=\s+ (?P<value>.*) ''', search_condition, re.X) m3 = re.search(r''' (?P<category>(staff_id)|(name)|(age)|(phone)|(dept)|(enroll_date)) \s+like\s+ (?P<value>[1-9]\d*) ''', search_condition, re.X) # age <|> \d 的情况 if m1: # 筛选条目 for i in staff_table: info_dict = dict(zip(['staff_id', 'name', 'age', 'phone', 'dept', 'enroll_date'], i)) if eval(m1.group().replace('age', str(i[2]))): res.append(info_dict) # category = \w+ 的情况 elif m2: # 筛选条目 for i in staff_table: # 对应信息表中每个条目的字典 info_dict = dict(zip(['staff_id', 'name', 'age', 'phone', 'dept', 'enroll_date'], i)) if str(info_dict[m2.group('category')]) == m2.group('value').strip(): res.append(info_dict) # category like \w+ 的情况 elif m3: for i in staff_table: info_dict = dict( zip(['staff_id', 'name', 'age', 'phone', 'dept', 'enroll_date'], i)) # 对应每个条目的字典 if info_dict[m3.group('category')].count(m3.group('value')) or \ str(info_dict[m3.group('category')]).count(str(m3.group('value'))): res.append(info_dict) # 条件格式不正确的情况 else: print('\033[1;31mwhere语句格式错误!\033[0m') # 无where条件 else: for i in staff_table: info_dict = dict(zip(['staff_id', 'name', 'age', 'phone', 'dept', 'enroll_date'], i)) res.append(info_dict) return res # 显示查找结果 def show(res, search_categories): if res: for i in res: # 查询所有条目 * if search_categories.strip() == '*': print(','.join([str(i['staff_id']), i['name'], str(i['age']), i['phone'], i['dept'], i['enroll_date']])) # 查询指定条目 name,age,... else: category_list = search_categories.split(',') for j in category_list: print(i[j.strip()], end=',') print() print('\n共查找到%d条记录\n' % len(res)) # 保存文件 def save(): with open('staff_table.pkl', 'wb') as f: pickle.dump(staff_table, f) if __name__ == '__main__': while 1: with open('staff_table.pkl', 'rb') as f: staff_table = pickle.load(f) cmd = input('command -> ') # 查询指令 search_cmd = re.search(r''' ^\s*select\s+ (?P<categories>\*| ( ((staff_id)|(name)|(age)|(phone)|(dept)|(enroll_date)) (\s*,\s*((staff_id)|(name)|(age)|(phone)|(dept)|(enroll_date)))? (\s*,\s*((staff_id)|(name)|(age)|(phone)|(dept)|(enroll_date)))? (\s*,\s*((staff_id)|(name)|(age)|(phone)|(dept)|(enroll_date)))? (\s*,\s*((staff_id)|(name)|(age)|(phone)|(dept)|(enroll_date)))?) ) \s+from\s+staff_table (\s+where\s+ (?P<condition>.*))?$''',cmd,re.X) # 添加指令 insert_cmd = re.search(r''' ^\s*[\w ]+, # 姓名 [1-9]\d*, # 年龄 \d{11}, # 手机号码 [\w ]+, # 部门 ((20)|(19))\d{2}-((10)|(11)|(12)|(0[1-9]))-(([0-2][1-9])|(3[01]))$ # 入职日期 ''',cmd,re.X) # 删除指令 delete_cmd = re.search(r'^\d+$',cmd) # 更改指令 update_cmd = re.search(r''' ^update\s+staff_table\s+set\s+ (?P<category_update>(name)|(age)|(phone)|(dept)|(enroll_date))\s+ =\s+ ('|")(?P<new_value>.*)('|") (\s+where\s+ (?P<condition>.*))?$ ''',cmd,re.X) # 查询 if search_cmd: search_categories = search_cmd.group('categories') search_condition = search_cmd.group('condition') res = search(search_condition) show(res,search_categories) # 添加 elif insert_cmd: insert_list = insert_cmd.group().split(',') repeat_flag = 0 for i in staff_table: if insert_list[2] == i[3]: print('\033[1;31m手机号码已存在!\033[0m') repeat_flag = 1 break else: insert_list.insert(0,( staff_table[-1][0] + 1 ) ) staff_table.append(insert_list) save() print('添加成功!') # 删除 elif delete_cmd: for i in staff_table: if delete_cmd.group() == str(i[0]): staff_table.remove(i) save() print('删除成功!') break else: print('\033[1;31m该staff_id不存在\033[0m') # 修改 elif update_cmd: search_condition = update_cmd.group('condition') res = search(search_condition) for i in range(len(staff_table)): for j in res: if staff_table[i][0] == j['staff_id']: category_update = update_cmd.group('category_update') new_value = update_cmd.group('new_value').strip() j[category_update] = int(new_value) if category_update == 'age' else new_value # 保证顺序,不能用list(j.values()) staff_table[i] = list([j['staff_id'],j['name'],j['age'],j['phone'],j['dept'],j['enroll_date']]) save() print('修改成功!') # 退出 elif cmd == 'q': break # 输入格式不正确的情况 else: print('\033[1;31m输入格式错误\033[0m')