用户输入条件
条件的解析, 把用户想要的列名 和 条件分开
处理文件
逐行读文件, 逐行处理
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来修改列名对应的值为“新的值”

注意:要想操作员工信息表,必须先登录,登陆认证需要用装饰器完成
其他需求尽量用函数实现
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)         # 将符合条件的内容按照用户的需求展示出来

 

版权声明:本文为dongye95原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dongye95/p/10327649.html