def filter_handler(operate,con): # '>','age>22'
'''
进行筛选工作
:param operate: 用户要进行的操作是: > 、< 、= 、like
:param con: 用户输入的where条件
:return: 被选中的所有行组成的列表,其中每一行都是一个列表
'''
selected_lst = [] # 被选中的列表
col,val = con.split(operate) # ['age','22']
col = col.strip()
val = val.strip()
judge = 'int(line_lst[column_dic[col]]) %s int(val)'%operate if operate == '<' or operate == '>' else 'line_lst[column_dic[col]] %s val'%operate
f = open('员工信息表.txt',encoding='utf-8')
for line in f:
line_lst = line.strip().split(',') # id name age phone job
if eval(judge): # int(line_lst[column_dic[col]])
selected_lst.append(line_lst)
f.close()
return selected_lst
def get_selected_line(con): # 'age>22'
'''
获取所有要查找的行,并将每一行作为一个列表项存储在selected_lst中
:param con:
:return: 存储了符合条件的行的列表
'''
if '>' in con:
selected_lst = filter_handler('>',con)
elif '<' in con:
selected_lst = filter_handler('<',con)
elif '=' in con:
selected_lst = filter_handler('==',con.replace('=','=='))
elif 'like' in con:
selected_lst = filter_handler('in',con)
return selected_lst
def get_show_lst(col_condition): # 'select name,age,job'
'''
获取要展示的列名
:param col_condition: 用户输入的select条件
:return: 列名组成的字典
'''
col_info_lst = col_condition.strip().split('select') # ['', 'name,age,job']
col_info_lst = [col_info_item for col_info_item in col_info_lst if col_info_item.strip()] # 去空
if col_info_lst: # ['name,age,job']
col_info = col_info_lst[0].strip() # ['name,age,job']
if '*' == col_info:
return column_dic.keys() # ['id','name','age','phone','job']
elif col_info:
ret = col_info.split(',') # ['name','age','job']
return [item.strip() for item in ret] # 对上述式子去空白
else:print(col_info)
def show(selected_lst,show_lst):
'''
展示符合条件的内容
:param selected_lst: 符合条件的行的列表
:param show_lst: 所有要提示的字段
:return: None
'''
for selected_item in selected_lst:
for col in show_lst:
print(selected_item[column_dic[col]],end = ' ')
print()
column_dic = {'id':0,'name':1,'age':2,'phone':3,'job':4} # 文件中每一列的名字和数字的对应关系
# 1. 接收用户的信息 -- 分析信息
condition = input('>>>') # 接收用户的指令: select name,age,job where age>22
# condition = 'select name,age,job where age>22'
ret = condition.split('where') # ['select name,age,job' , 'age>22']
con = ret[1].strip() # 根据select条件解析用户需要展示的内容: 'age>22'
show_lst = get_show_lst(ret[0]) # 根据where条件解析用户需要展示的内容: 'select name,age,job'
# show_lst = ['name','age','job']
selected_lst = get_selected_line(con) # selected_lst中存储了所有符合条件的内容
show(selected_lst,show_lst) # 将符合条件的内容按照用户的需求展示出来