用户输入条件
条件的解析, 把用户想要的列名 和 条件分开
处理文件
逐行读文件, 逐行处理
1.默写:带参数的装饰器。需要标注代码的执行步骤。
2.整理作业:函数的知识点以及装饰器相关作业。装饰器作业需要自己写一遍,并给作业加注释。
3.周末大作业:实现员工信息表
文件存储格式如下:
id,name,age,phone,job
1,Alex,22,13651054608,IT
2,Egon,23,13304320533,Tearcher
3,nezha,25,1333235322,IT
现在需要对这个员工信息文件进行增删改查。
不允许一次性将文件中的行都读入内存。
基础必做:
a.可以进行查询,支持三种语法:
select 列名1,列名2,… where 列名条件
支持:大于小于等于,还要支持模糊查找。
示例:
select name, age where age>22
select * where job=IT
select * where phone like 133
进阶选做:
b.可创建新员工记录,id要顺序增加
c.可删除指定员工记录,直接输入员工id即可
d.修改员工信息
语法:set 列名=“新的值” where 条件
#先用where查找对应人的信息,再使用set来修改列名对应的值为“新的值”
注意:要想操作员工信息表,必须先登录,登陆认证需要用装饰器完成
其他需求尽量用函数实现
1 def filter_handler(operate,con): # '>','age>22'
2 '''
3 进行筛选工作
4 :param operate: 用户要进行的操作是: > 、< 、= 、like
5 :param con: 用户输入的where条件
6 :return: 被选中的所有行组成的列表,其中每一行都是一个列表
7 '''
8 selected_lst = [] # 被选中的列表
9 col,val = con.split(operate) # ['age','22']
10 col = col.strip()
11 val = val.strip()
12 judge = 'int(line_lst[column_dic[col]]) %s int(val)'%operate if operate == '<' or operate == '>' else 'line_lst[column_dic[col]] %s val'%operate
13 f = open('员工信息表.txt',encoding='utf-8')
14 for line in f:
15 line_lst = line.strip().split(',') # id name age phone job
16 if eval(judge): # int(line_lst[column_dic[col]])
17 selected_lst.append(line_lst)
18 f.close()
19 return selected_lst
20
21 def get_selected_line(con): # 'age>22'
22 '''
23 获取所有要查找的行,并将每一行作为一个列表项存储在selected_lst中
24 :param con:
25 :return: 存储了符合条件的行的列表
26 '''
27 if '>' in con:
28 selected_lst = filter_handler('>',con)
29 elif '<' in con:
30 selected_lst = filter_handler('<',con)
31 elif '=' in con:
32 selected_lst = filter_handler('==',con.replace('=','=='))
33 elif 'like' in con:
34 selected_lst = filter_handler('in',con)
35 return selected_lst
36
37 def get_show_lst(col_condition): # 'select name,age,job'
38 '''
39 获取要展示的列名
40 :param col_condition: 用户输入的select条件
41 :return: 列名组成的字典
42 '''
43 col_info_lst = col_condition.strip().split('select') # ['', 'name,age,job']
44 col_info_lst = [col_info_item for col_info_item in col_info_lst if col_info_item.strip()] # 去空
45 if col_info_lst: # ['name,age,job']
46 col_info = col_info_lst[0].strip() # ['name,age,job']
47 if '*' == col_info:
48 return column_dic.keys() # ['id','name','age','phone','job']
49 elif col_info:
50 ret = col_info.split(',') # ['name','age','job']
51 return [item.strip() for item in ret] # 对上述式子去空白
52 else:print(col_info)
53
54 def show(selected_lst,show_lst):
55 '''
56 展示符合条件的内容
57 :param selected_lst: 符合条件的行的列表
58 :param show_lst: 所有要提示的字段
59 :return: None
60 '''
61 for selected_item in selected_lst:
62 for col in show_lst:
63 print(selected_item[column_dic[col]],end = ' ')
64 print()
65
66 column_dic = {'id':0,'name':1,'age':2,'phone':3,'job':4} # 文件中每一列的名字和数字的对应关系
67 # 1. 接收用户的信息 -- 分析信息
68 condition = input('>>>') # 接收用户的指令: select name,age,job where age>22
69 # condition = 'select name,age,job where age>22'
70 ret = condition.split('where') # ['select name,age,job' , 'age>22']
71 con = ret[1].strip() # 根据select条件解析用户需要展示的内容: 'age>22'
72 show_lst = get_show_lst(ret[0]) # 根据where条件解析用户需要展示的内容: 'select name,age,job'
73 # show_lst = ['name','age','job']
74 selected_lst = get_selected_line(con) # selected_lst中存储了所有符合条件的内容
75 show(selected_lst,show_lst) # 将符合条件的内容按照用户的需求展示出来