函数例子--迭代器--员工信息表

实现员工信息表
文件存储格式如下:
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)
View Code

 

posted on 2019-03-24 19:30  Jerry-Wang  阅读(158)  评论(0)    收藏  举报