python基础-day16

考试题目整理
#python2和python3的一个区别,
k=1000
count = 0
while k>1:
    count+=1
    print(k)
    k=k/2
    
#在python2中输出1到9,
#在python3中输出1到10,
#原因是对于1.9这个数字
#python2中会当作1,
#python3中会当作1.9,
#会影响到k>1的判断,


l1 = []
with open('t1.txt',encoding='utf-8') as f1:
    name_list = f1.readline().strip().split(',')
    for i in f1:
        dic = {}
        i_list = i.strip().split(',')
        for j in range(len(i_list)):
            dic[name_list[j]] = i_list[j]
        l1.append(dic)
print(l1)
#重点看这句:name_list = f1.readline().strip().split(',')
#这句实现了真正意义上的通用,
#之前还是在开头定义好了表头,
#这个直接从文件中读取,进而获取表头的结构,


choice_dict = {
    1: login,
    2: register,
    3: article,
    4: diary,
    5: comment,
    6: enshrine,
    7: login_out,
    8: Quit,
}

choice = input('请输入您选择的序号:').strip()
if choice.isdigit():
    choice = int(choice)
    if 0 < choice <= len(choice_dict):
        choice_dict[choice]()
#这个写法可以学习,把选择定义进字典,就没有那么多elif的判断了,



#员工信息查询作业,我在参考太白老师select功能代码后,写出了set功能的代码,
name_list = ['id', 'name', 'age', 'phone', 'job']   #索引与员工信息表每行信息的每列一一对应
check_conditions = ['>', '<', '=', 'like']

def update():
    try:        #这个异常捕获倒是懒,这么大堆语句,直接一个try,就处理了,
        update_info = input('请输入更新语句:格式set name=value where cond').strip()
        content, condition = update_info.split('where')     #把set更新语言以where为标志,分为查询内容和查询条件两部分
        if 'set' in content:        #如果内容中没有set,说明语句肯定有问题
            for key in check_conditions:    #遍历>,<,=,like判断条件,
                if key in condition:        #进一步确定,我们更新语句中是哪一个判断条件,
                    index_check_conditions = check_conditions.index(key)    #后面有一个字典,可以将一个判断类型符号,转换到一个完整的判断语句,见36行,
                    name,cond = condition.strip().split(key)    #对条件(比如a>5)进行处理,得到键和值(a和5),
                    content = ''.join(content.split('set')[1:])     #得到我们要更改内容的键值对,
                    with open('员工信息表', encoding='utf-8') as f1,\
                        open('员工信息表_bak',encoding='utf-8', mode= 'w') as f2:
                        for line in f1:
                            if line.strip():
                                line_list = [i.strip() for i in line.strip().replace(',', ',').split(',')]  #将文件中每行记录,处理为列表的形式,
                                index = name_list.index(name.strip())   #获取我们查询条件中的键,在表头中的位置在哪.
                                check_dict = {          #解读下字典,任何条件的判断,到最后往往都是转换为数值大小的比较or字符串相关的比较,
                                    0: int(line_list[index]) > int(cond),   #前面的值是通过index获取从文件中读取某条记录某项的值,后面是我们输入语句条件部分的值,
                                    1: int(line_list[index]) < int(cond),
                                    2: line_list[index].strip() == cond.strip(),
                                    3: cond.strip() in line_list[index].strip(),    #原来like内部是通过in来判断的啊,
                                }
                                if check_dict[index_check_conditions]:  #字典中的键,在前面通过check_conditions获取了,
                                    # print('OK')   #这里返回True或者False,来决定我们是否要修改当前读取到的这行记录,
                                    str1 = ''
                                    if ','in content.strip(): #有,代表要更改多项数值,没有说明只更改一项数据,
                                        print('OK_1')
                                        update_name_value_list = content.strip().split(',') #将要更新的语句中的键值对,分隔开来,
                                        update_name_list = []
                                        print('OK_2',update_name_value_list)
                                        for x in update_name_value_list:
                                            update_name_list.append([x.split('=')[0],x.split('=')[1]])  #将我们要更新的数据,以列表的形式添加进另一个列表中保存,
                                        print('OK_3', update_name_list)

                                        for x in name_list: #以name_list中数据存储的顺序为基础循环,并比较我们要更改的数据,
                                            for names_values in update_name_list:
                                                if names_values[0] == x:    #此处相等说明,当前数据项是我们要更新的,
                                                    str1 = str1 + names_values[1]+',' #将我们要修改的数据添加进str中,
                                                    break
                                            else:
                                                str1 = str1 + line_list[name_list.index(x)]+ ',' #此处相当于没有修改要修改项目的值,

                                        str1 = str1[:-1]    #末尾多了个,所以这里就是来消除的,
                                        print('OK_5', str1)
                                        f2.write(str1) if f2.tell() == 0 else f2.write('\n{}'.format(str1))     #有内容的文件,写入是接着最后一行的后面,所以根据情况判断是否添加\n,
                                    else:
                                        #下面的分支,为修改的数据项只有一个的情况,比上面的还简单写,不重复描述了!!!
                                        update_name_list = content.strip().split('=')
                                        for x in name_list:
                                            if update_name_list[0] == x:
                                                str1 = str1 + update_name_list[1] + ','
                                            else:
                                                str1 = str1 + line_list[name_list.index(x)] + ','
                                        str1 = str1[:-1]
                                        f2.write(str1) if f2.tell() == 0 else f2.write('\n{}'.format(str1))


                                else:
                                    print(line,'这里没有被修改',f2.tell())     #不满足查询条件的部分,直接将原语句写入,
                                    f2.write(line) if f2.tell()==0 else f2.write('\n{}'.format(line))

            os.remove('员工信息表')
            print('OK_7')
            os.rename('员工信息表_bak','员工信息表')
        else:
            print('你没有输入set或者set输入有误,请重新输入')
    except Exception:
        print('你输入的查询语句有误,请重新输入')
        
# ps:
# d = {'YQ':33}
# print(d)        # {'YQ': 33}
# print(d.keys())     # dict_keys(['YQ'])
# print(d.values())   # dict_values([33])
# print(d.items())    # dict_items([('YQ', 33)])
# 刚求证了,字典确实没有办法直接获取,键or值,for循环倒是可以,就是感觉有点冗余,



#景老师版的员工信息查询,模块化比较高,只有查功能,set的改功能我还没有实现.
def read_file():
    with open('员工信息表',encoding='utf-8') as f:   #这里把读取文件,做成了迭代器,好样的!!!然后呢,我这里被自己吭了,就是中英文逗号的问题,
        for line in f:
            line_lst = line.strip().split(',')
            yield line_lst

def filter_item(col,value,condition):
    dic = {'id':0,'name':1,'age':2,'phone':3,'job':4}
    correct = []
    for line_lst in read_file():    #这里是从文件中读取数据,不过这个数据是处理过的,即数据项以列表的形式存在,
        if eval(condition):         #这里是上一个函数的条件判断语句,条件判断,就两种可能,True或False,满足就把数据添加进列表,
            correct.append(line_lst)
    return correct

def condition_an(con):
    if '>' in con:                      #这里是age>22,这里的四个分支都一样
        col_name,value = con.split('>')     #得到age 和 22 两部分,
        condition = 'int(line_lst[dic[col]]) > int(value)'  #首先这里是字符串,然后里面的那些变量,在传递到后面会出现的,
    elif '<' in con:
        col_name,value = con.split('<')
        condition = 'int(line_lst[dic[col]]) < int(value)'
    elif '=' in con:
        col_name,value = con.split('=')
        condition = 'line_lst[dic[col]] == value'
    elif 'like' in con:
        col_name,value = con.split('like')
        condition = 'value in line_lst[dic[col]]'
    correct = filter_item(col_name.strip(), value.strip(), condition)  #传入键值对和筛选条件,int(line_lst[dic[col]]) > int(value)
    return correct

def show(col,correct):      #这里的col,是我们查询语句中的待查数据项,
    dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4}
    if '*' == col.strip():
        col_lst = dic.keys()      #这里会得到表头的信息,
    else:
        col_lst = col.split(',')
    for i in correct:       #这里的i是一行完整的信息,
        for col in col_lst:     #不过打印什么信息,取决于这里,即前面可能包含了5个信息,但是这里的循环,可能之后3个,总之少于5个,
            print(i[dic[col]],end=' ')          #并且这里通过dic字典,可以得到我们要查询数据项在整个数据中的位置,
        print()         #这里的print,是为了换行而存在的,

exp = 'select * where age>22'           #待查询的语句
col,con = exp.split('where')              #将语句分隔为两部分,前面是待查询的数据项,后面是筛选条件,
col = col.replace('select','').strip()    #打印结果是*,相当于仅留下待查询的数据项部分,
print(col,con)                              #显示:*  age>22
correct = condition_an(con)                 #对条件进行处理,
show(col,correct)                           #显示数据的函数,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值