函数例子--迭代器--员工信息表
实现员工信息表 文件存储格式如下: 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来修改列名对应的值为“新的值” 注意:要想操作员工信息表,必须先登录,登陆认证需要用装饰器完成
笔者自己写的一段代码,没有使用函数
with open('user','r+',encoding='utf-8') as f: l = [] for i in f: a = i.strip().split(',') l.append(a) li = [] for i in l: dic = {} # 放这里是因为每次for循环重新产生一个空字典(不同的内存地址),如果放外面都是同一个内存地址添加到列表的内容都变成一样了 dic['id'] = i[0] dic['name'] = i[1] dic['age'] = i[2] dic['phone'] = i[3] dic['job'] = i[4] li.append(dic) print(li) # test = input(">>>>>>") test = 'select name,age where age>22' test_li = test.split() if test_li[1] != '*': test_li_1 = test_li[1].split(',') for iii in test_li_1: if iii in test_li[-1]: aa = iii else: aa = '*' if test_li[-1].isalpha() or test_li[-1].isdigit(): bb = test_li[-1].split() else: for i in test_li[-1]: if i == '>'or i == '<'or i =='=': cc = i bb = test_li[-1].split(i) # aa 指的是 key值 # bb 指的是 where 后面的内容 同时已经切换为列表 ['key','value'] # cc 指的是 where 后面的内容 即 大于等于小于 三种符号的其中一种 for d in li: for k,v in d.items(): if aa == '*': if len(test_li) >= 5 : if test_li[-3] == k: if test_li[-1] in v: print(d) else: if bb[0] ==k: if bb[-1] in v: print(d) elif aa == k: #等于字典的key if bb[-1].isalpha(): if bb[-1] == d[aa]: print(d) if bb[-1].isdigit(): if cc == '=': if d[aa] == bb[-1]: print(d) elif cc == '>': if d[aa] > bb[-1]: print(d) elif cc == '<': if d[aa] < bb[-1]:
笔者用函数写的代码
# 先读取文件,并将内容存储到字典里 def file_open(file): with open(file,encoding='utf-8') as f: #定义一个空列表接收文件内容 l = [] for i in f: l.append(i.strip().split(',')) #定义一个空字典将id name age phone job储存起来,同时将字典储存在一个列表里 li = [] for i in l: d = {} d['id'] = i[0] d['name'] = i[1] d['age'] = i[2] d['phone'] = i[3] d['job'] = i[4] li.append(d) return li info = file_open('user') print('这里显示文件的内容:',info) # 开始用户输入条件 # test = 'select name,age,job where name=jerry' test = 'select name,age,job where age>22' # test = 'select * where age>22' # test = 'select name,phone where phone like 133' # test = 'select * where job=IT' # 对条件进行分析 # 先将语句进行分割,切出 要查的内容和条件 def division_input(msg): content,conditions = msg.strip().split('where') content = content.strip().split('select') for i in content: # 这里是去除空元素 if i.strip(): content = i content = content.strip().split(',') # conditions = conditions.strip().split(' ') return content,conditions content,conditions = division_input(test) print('这里显示内容和条件:',content,conditions) # 然后根据内容显示,文件内后的数据 def display_content(content): # [name,age] l = [] # 定义一个空列表来装匹配到的信息 for i in info: for ii in content: # ii = name msg = {} if ii == '*': return info else: # ii = name msg[ii] =i[ii] l.append(msg) # li = [] # 定义一个空列表来装切片后的信息 # n=0 # num = len(content) # 需匹配内容的长度 # m = len(l)/num # 通过计算上个列表的长度除以匹配内容的长度得出需要循环的次数 # while n<m: # print(l[(n*num):((n+1)*num)])# 如果匹配内容有三个[0:3][3:6][6:9] [n*mun:(n+1)*num] # 切片,将切片内容加到新列表中 # n+=1 return l content_all = display_content(content) print('这是匹配找到的内容:',content_all) # 对条件进行转换,重新获得条件值 def display_conditions(conditions): if 'like' in conditions: conditions = conditions.strip().split(' ') elif '>' in conditions: conditions = conditions.strip().split('>') conditions.insert(1,'>') elif '>' in conditions: conditions = conditions.strip().split('<') conditions.insert(1, '<') elif '=' in conditions: conditions = conditions.strip().split('=') conditions.insert(1, '=') return conditions conditions = display_conditions(conditions) print('这里显示条件的内容:',conditions) print('这里显示内容的信息:',content) def func(ret): l = [] # 定义字典接收value值 for i in ret: for k,v in i.items(): l.append(v) for i in l: # 字符串拼接 print('%s,'%i,end='') print() # 相当于一个回车 # 内容和条件对总表进行匹配,打印内容 def display(content,content_all,conditions): n=0 num = len(content) # 需匹配内容的长度 m = len(content_all)/num # 通过计算上个列表的长度除以匹配内容的长度得出需要循环的次数 while n<m: ret = (content_all[(n*num):((n+1)*num)])# 如果匹配内容有三个[0:3][3:6][6:9] [n*mun:(n+1)*num] # 切片,将切片内容加到新列表中 for i in ret: for k,v in i.items(): if '=' in conditions: if k == conditions[0] and v == conditions[-1]: func(ret) elif '>' in conditions: if k == conditions[0] and v > conditions[-1]: func(ret) elif '<' in conditions: if k == conditions[0] and v < conditions[-1]: func(ret) elif 'like' in conditions: if k == conditions[0] and conditions[-1] in v: func(ret) n+=1 display(content,content_all,conditions)
# 内容和条件对总表进行匹配,打印内容 def display(content,content_all,conditions): n=0 num = len(content) # 需匹配内容的长度 m = len(content_all)/num # 通过计算上个列表的长度除以匹配内容的长度得出需要循环的次数 while n<m: ret = (content_all[(n*num):((n+1)*num)])# 如果匹配内容有三个[0:3][3:6][6:9] [n*mun:(n+1)*num] # 切片,将切片内容加到新列表中 for i in ret: for k,v in i.items(): if '=' in conditions: if k == conditions[0] and v == conditions[-1]: func(ret) elif '>' in conditions: if k == conditions[0] and v > conditions[-1]: func(ret) elif '<' in conditions: if k == conditions[0] and v < conditions[-1]: func(ret) elif 'like' in conditions: if k == conditions[0] and conditions[-1] in v: func(ret) n+=1 # 结果以字符串输出 def func(ret): l = [] # 定义字典接收value值 for i in ret: for k,v in i.items(): l.append(v) for i in l: # 字符串拼接 print('%s,'%i,end='') print() # 相当于一个回车 # 对条件进行转换,重新获得条件值 def display_conditions(conditions): if 'like' in conditions: conditions = conditions.strip().split(' ') elif '>' in conditions: conditions = conditions.strip().split('>') conditions.insert(1,'>') elif '>' in conditions: conditions = conditions.strip().split('<') conditions.insert(1, '<') elif '=' in conditions: conditions = conditions.strip().split('=') conditions.insert(1, '=') return conditions # 然后根据内容显示,文件内后的数据 def display_content(content): # [name,age] l = [] # 定义一个空列表来装匹配到的信息 for i in info: for ii in content: # ii = name msg = {} if ii == '*': return info else: # ii = name msg[ii] =i[ii] l.append(msg) # li = [] # 定义一个空列表来装切片后的信息 # n=0 # num = len(content) # 需匹配内容的长度 # m = len(l)/num # 通过计算上个列表的长度除以匹配内容的长度得出需要循环的次数 # while n<m: # print(l[(n*num):((n+1)*num)])# 如果匹配内容有三个[0:3][3:6][6:9] [n*mun:(n+1)*num] # 切片,将切片内容加到新列表中 # n+=1 return l # 先将语句进行分割,切出 要查的内容和条件 def division_input(msg): content,conditions = msg.strip().split('where') content = content.strip().split('select') for i in content: # 这里是去除空元素 if i.strip(): content = i content = content.strip().split(',') # conditions = conditions.strip().split(' ') return content,conditions # 先读取文件,并将内容存储到字典里 def file_open(file): with open(file,encoding='utf-8') as f: #定义一个空列表接收文件内容 l = [] for i in f: l.append(i.strip().split(',')) #定义一个空字典将id name age phone job储存起来,同时将字典储存在一个列表里 li = [] for i in l: d = {} d['id'] = i[0] d['name'] = i[1] d['age'] = i[2] d['phone'] = i[3] d['job'] = i[4] li.append(d) return li info = file_open('user') # print('这里显示文件的内容:',info) # 开始用户输入条件 test = input('>>>>>>') # test = 'select name,age,job where name=jerry' # test = 'select name,age,job where age>22' # test = 'select * where age>22' # test = 'select name,phone where phone like 133' # test = 'select * where job=IT' # 对条件进行分析 content,conditions = division_input(test) # print('这里显示内容和条件:',content,conditions) content_all = display_content(content) # print('这是匹配找到的内容:',content_all) conditions = display_conditions(conditions) # print('这里显示条件的内容:',conditions) # print('这里显示内容的信息:',content) display(content,content_all,conditions)
教程里的代码
column_dic = {'id':0,'name':1,'age':2,'phone':3,'job':4} # 文件中每一列的名字和数字的对应关系
def filter_handler(operate,con):
'''
进行筛选工作
:param operate: 用户要进行的操作是>/</=/like
:param con: 用户输入的where条件
:return: 被选中的所有行组成的列表,其中每一行都是一个列表
'''
selected_lst = []
col,val = con.split(operate)
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]]'
with open('user',encoding='utf-8') as f:
for line in f:
line_lst = line.strip().split(',')
if eval(judge):
selected_lst.append(line_lst)
return selected_lst
def get_selected_line(con):
'''
获取所有要朝朝的行,并将每一行作为一个列表项存储在select_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):
'''
获取要展示的列名
:param col_condition: 用户输入的select条件
:return: 列名组成的字典
'''
col_info_lst = col_condition.strip().split('select')
col_info_lst = [col_info_item for col_info_item in col_info_lst if col_info_item.strip()]
if col_info_lst:
col_info = col_info_lst[0].strip()
if '*' == col_info:
return column_dic.keys()
elif col_info:
ret = col_info.split(',')
return [item.strip() for item in ret]
else:
print(col_info)
def show(selected_lst,show_list):
'''
展示符合条件的内容
:param selected_lst:符合条件的行的列表
:param show_list: 所有要展示的字段
:return: None
'''
for selected_item in selected_lst:
for col in show_lst:
print(selected_item[column_dic[col]],end=' ')
print()
condition = input('>>>>>>') # 接收用户的指令
# 解析用户的指令
ret = condition.split('where')
con = ret[1].strip()
#根据select条件解析用户需要展示的内容
show_lst = get_show_lst(ret[0])
# 根据where条件解析筛选用户想查找的内容
selected_lst = get_selected_line(con) # selected_lst中储存了所有符合条件的内容
# 将符合条件的内容按照用户的需求展示出来
show(selected_lst,show_lst)
浙公网安备 33010602011771号