import os
file_name = '员工信息表'
noun_list = ['staff_id', 'name', 'age', 'phone', 'dept', 'enroll_date']
def file_operation(file):
'''
先进行文件操作,把文件内容加载到内存,以方便调用的形式储存文件信息
:param file_name:
:return:
'''
file_info = open(file, 'r', encoding='utf-8')
data_dic = {'staff_id': [], 'name': [], 'age': [], 'phone': [], 'dept': [], 'enroll_date': []}
for line in file_info:
info_id, info_name, info_age, info_tel, info_dept,info_time=line.split(',')
# 按照上述的顺序依次把信息存入value的空列表中
data_dic['staff_id'].append(info_id)
data_dic['name'].append(info_name)
data_dic['age'].append(info_age)
data_dic['phone'].append(info_tel)
data_dic['dept'].append(info_dept)
data_dic['enroll_date'].append(info_time)
file_info.close()
return data_dic
def file_save():
f = open('临时存放','w',encoding='UTF-8')
for id_index, id in enumerate(data['staff_id']):
info_list = []
for noun in noun_list:
info_list.append(data[noun][id_index])
f.write(','.join(info_list))
f.close()
os.replace('临时存放',file_name)
def catch_order(): #获取用户指令 # step:1
while True:
user_order = input('请输入指令:\n--->\t').strip() # 交互第一步,让用户输入指令,首尾去空格
if not user_order: continue
input_order(user_order) # 把用户指令传入(指令分析)的函数 # 2
def print_login(msg,login_type='info'):
if login_type == 'info':
print('\033[31;1m%s\033[0m' %msg)
elif login_type == 'error':
print('\033[41;1m%s\033[0m' %msg)
def input_order(order): # step:2
'''
获取并分析用户输入的指令
:return:
'''
judge = {'find': find_info, 'add': add_info, 'del': del_info, 'update': update_info}
if order.split()[0] in ('find', 'add', 'del', 'update'): # 查看指令的开头写的动作,是否在支持的范围内
if 'where'in order:
left_order, right_order = order.split('where') # 以where为界,把信息分为两半,左半是动作,右半是条件
catch_info = judge_right(right_order) # 把右半边的筛选条件传入(判断where)的函数里面 # 3 -> 5
# 把抓取的信息和具体的操作指令传入操作函数中
info_action = order.split()[0]
if info_action in judge:
judge[info_action](catch_info, left_order)
else:
catch_info = []
for id_index, id in enumerate(data['staff_id']):
info_list = []
for noun in noun_list:
info_list.append(data[noun][id_index])
catch_info.append(info_list)
info_action = order.split()[0]
if info_action in judge:
judge[info_action](catch_info, order)
else:
print_login('输入有误,无法获取具体指令!')
def judge_greater(n, c): # 判断语句中有大于号的情况 # step:4
'''
判断大于的情况
:param n: 这是要筛选的对象名称(年龄,职位...)
:param c: 这是要筛选的具体条件(IT,22, 2017...)
:return: 把筛选出的内容
'''
staff_info_1 = []
for index,condition in enumerate(data[n]):
if float(condition) > float(c): # 如果原有信息大于传进来的具体条件
staff_info_2 = []
for noun in noun_list:
staff_info_2.append(data[noun][index])
staff_info_1.append(staff_info_2)
return staff_info_1
def judge_smaller(n, c): # 判断语句中有小于号的情况 # step:4
'''
判断小于的情况
:param n: 这是要筛选的对象名称(年龄,职位...)
:param c: 这是要筛选的具体条件(IT,22, 2017...)
:return:
'''
pass
staff_info_1 = []
for index,condition in enumerate(data[n]):
if float(condition) < float(c):
staff_info_2 = []
for noun in noun_list:
staff_info_2.append(data[noun][index])
staff_info_1.append(staff_info_2)
return staff_info_1
def judge_equal(n, c): # 判断语句中有等于号的情况 # step:4
'''
判断等于的情况
:param n: 这是要筛选的对象名称(年龄,职位...)
:param c: 这是要筛选的具体条件(IT,22, 2017...)
:return:
'''
staff_info_1 = []
for index,condition in enumerate(data[n]):
if condition == c: # 如果原有信息大于传进来的具体条件
staff_info_2 = []
for noun in noun_list:
staff_info_2.append(data[noun][index])
staff_info_1.append(staff_info_2)
return staff_info_1
def judge_like(n, c): # 判断语句中有like的情况 # step:4
'''
判断相似的情况
:param n: 这是要筛选的对象名称(年龄,职位...)
:param c: 这是要筛选的具体条件(IT,22, 2017...)
:return:
'''
staff_info_1 = []
for index, condition in enumerate(data[n]):
if c in condition: # 如果原有信息大于传进来的具体条件
staff_info_2 = []
for noun in noun_list:
staff_info_2.append(data[noun][index])
staff_info_1.append(staff_info_2)
return staff_info_1
def judge_right(right_order): # step: 3
'''
分析右半边的筛选条件,并过滤数据输出符合条件的信息
:param right_order:
:return:
'''
judge = {'>': judge_greater, '<': judge_smaller, '=': judge_equal, 'like': judge_like}
# 把符号和对应的函数名存成字典,循环字典来判断语句中的筛选符号是什么
for judge_k,judge_func in judge.items():
if judge_k in right_order:
noun, condition = (right_order.split(judge_k))
noun = str(noun).strip()
condition = str(condition).strip()
# 把名词,条件按照相应输入的判断符号来区分开
catch_info = judge_func(noun,condition) # 把获取来的名词和筛选条件传进匹配函数,来进行筛选 # 4
return catch_info
else:
print_login('输入有误,缺少明确的判断符号(>,<,=,like...)!')
#走到这就说明指令里面没有明确的判断符,无法进行下一步判断
def find_info(catch_info, left_order):
'''
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
:param catch_info:
:param left_order:
:return:
'''
count = 0
if '*' not in left_order:
noun_line = left_order.split('from')[0][4:].split(',')
noun_point = [i.strip() for i in noun_line]
for row_info in catch_info:
for noun in noun_point:
noun_index = noun_list.index(noun)
print(noun, row_info[noun_index])
count += 1
else:
print(catch_info)
count = len(catch_info)
print_login('本次共涉及%s条信息'%(count), 'info')
def add_info(catch_info,left_order):
'''
add staff_table Alex Li,25,134435344,IT,2015‐10‐29
:param catch_info: [['1', 'Alex Li', '22', '13651054608', 'IT', '2013‐04‐01\n'], ['3', 'Rain Wang', '21', '13451054608', 'IT', '2017‐04‐01\n'], ['4', 'Mack Qiao', '44', '15653354208', 'Sales', '2016‐02‐01\n'], ['5', 'Rachel Chen', '23', '13351024606', 'IT', '2013‐03‐16\n'], ['6', 'Eric Liu', '19', '18531054602', 'Marketing', '2012‐12‐01\n'], ['7', 'Chao Zhang', '21', '13235324334', 'Administration', '2011‐08‐08\n'], ['8', 'Kevin Chen', '22', '13151054603', 'Sales', '2013‐04‐01\n'], ['9', 'Shit Wen', '20', '13351024602', 'IT', '2017‐07‐03\n'], ['10', 'Shanshan Du', '26', '13698424612', 'Operation', '2017‐07‐02']]
:param left_order: add staff_table Alex Li,25,134435344,IT,2015‐10‐29
:return:
'''
info_list = [i.strip() for i in ''.join([i.strip() for i in left_order.split('staff_table')[1:]]).split(',')]
if info_list[2] not in data['phone']:
data['staff_id'].append(str(int(data['staff_id'][-1]) + 1))
data['name'].append(info_list[0])
data['age'].append(info_list[1])
data['phone'].append(info_list[2])
data['dept'].append(info_list[3])
#info_list[4] = '%s\n'%(info_list[4])
data['enroll_date'].append('%s\n'%(info_list[4]))
file_save()
else:
print('电话号码有重复,不可注册!', 'error')
def del_info(catch_info,left_order):
'''
del from staff where staff_id=3
删除的语法要写staff_id,写id是找不到对应函数的
:param catch_info:
:param left_order: del from staff where id=3
:return:
'''
count = 0
print('你将要删除:', catch_info)
for info in catch_info:
index = data['staff_id'].index(info[0])
for noun in noun_list:
del data[noun][index]
count += 1
print_login('本次共涉及%s条信息'%(count), 'info')
file_save()
def update_info(catch_info,left_order):
'''
update staff_table set dept=Market where dept = IT
update staff_table set age=25 where name = Alex Li
:param catch_info:
:param left_order:
:return:
'''
count = 0
noun = [i.strip() for i in left_order.split('set')[1].strip().split('=')]
print('你要修改 %s 为 %s'%(noun[0], noun[1]))
for info in catch_info:
index_id = data['staff_id'].index(info[0])
for n in noun_list:
data[noun[0]][index_id] = noun[1]
count += 1
print_login('本次共涉及%s条信息'%(count), 'info')
file_save()
data = file_operation(file_name) # 获得文件内容
catch_order() # 执行操作