转载自Eva_J的作业

作业大礼包——员工信息表

 

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.今天的第2、3个作业一起打包交上来
2.放在作业2文件夹中
需要交整理的函数相关的思维导图
整理的函数知识点的博客
装饰器作业加注释
3.大作业放在3文件夹中
  文件夹中需要包括:
  代码
  流程图(请上交一张png图片。如果没有合适的画图软件,可以用processon画)
  readme文件(请上交一个txt文件,对作业进行一些简单说明,包括作业的整体思路,如何运行,实现了哪些功能,遇到了哪些问题等。)

import os
def fieldtoid(field):     #字段转下标
    if field.strip() == 'id': return 0
    elif field.strip() == 'name' : return 1
    elif field.strip() == 'age' : return 2
    elif field.strip() == 'phone' : return 3
    elif field.strip() == 'job' : return 4
    else:
        return -1
def select(li_order):       #查询
    if li_order[1][0].strip()=='*':  #判断是否打印所有列
        if li_order[2]!='': #有条件,判断条件打印
            if li_order[2][1]=='>':
                with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        li_line = line.split(',')
                        if li_line[li_order[2][0]]>li_order[2][2]:print(line)
            elif  li_order[2][1]=='<':
                with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        li_line = line.split(',')
                        if li_line[li_order[2][0]]<li_order[2][2]:print(line)
            elif  li_order[2][1]=='=':
                with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        li_line = line.split(',')
                        if li_line[li_order[2][0]]==li_order[2][2]:print(line)
            elif  li_order[2][1]=='link':
                with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        li_line = line.split(',')
                        if li_order in li_line[li_order[2][0]]:print(line)
            else: print('出错啦!!!')
        else:  #无条件时,打印全部
            with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        print(line)
    else:                            #按列打印
        if li_order[2]!='': #有条件,判断条件打印
            if li_order[2][1]=='>':
                with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        li_line = line.strip().split(',')
                        if li_line[li_order[2][0]]>li_order[2][2]:
                            for i in li_order[1]:
                                print(li_line[int(i)],end=',')
                            print('\n')
            elif  li_order[2][1]=='<':
                with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        li_line = line.strip().split(',')
                        if li_line[li_order[2][0]]<li_order[2][2]:
                            for i in li_order[1]:
                                print(li_line[int(i)],end=',')
                            print('\n')
            elif  li_order[2][1]=='=':
                with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        li_line = line.strip().split(',')
                        if li_line[li_order[2][0]]==li_order[2][2]:
                            for i in li_order[1]:
                                print(li_line[int(i)],end=',')
                            print('\n')
            elif  li_order[2][1]=='link':
                with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        li_line = line.strip().split(',')
                        if li_order[2][2] in li_line[li_order[2][0]]:
                            for i in li_order[1]:
                                print(li_line[int(i)],end=',')
                            print('\n')
            else: print('出错啦!!!')
        else:  #无条件时,打印全部
            with open('员工信息','r',encoding='utf-8') as f:
                    for line in f:
                        print(line)
def append(li_order): #添加
    if li_order[2]!='':print('语法错误!!!')
    else:
        with open('员工信息','r+',encoding='utf-8')as f:
            filesize = os.path.getsize('员工信息')
            print(filesize)
            off=512#设置偏移量
            if filesize/off>1:
                off=512*(filesize/off-1)
                f.seek(off,0)  #seek(off, 2)表示文件指针:从文件末尾(2)开始向前50个字符(-50)
            lines=f.readlines() #读取文件指针范围内所有行
            last_line=int(lines[-1].split(',')[0])+1 #取最后一行
            line=[str(last_line),'','','','']
            for i in range(0,len(li_order[1])):
                li_order[1][i]=li_order[1][i].split('=') #将添加字段的值转为列表格式
                if fieldtoid(li_order[1][i][0])==-1:
                    print('输入的列名有误')
                    return
                line[fieldtoid(li_order[1][i][0])]=li_order[1][i][1].strip()#将列名转为下标
            line=','.join(line)
            f.write('\n')
            f.write(line)
def delete(li_order):
    print('删除')
def sett(li_order):
    print('修改')

while 1:
    order = input('>')
    li_order=[]
    li_order.append(order.strip()[0:order.find(' ')].strip())
    if 'where' in order:
        li_order.extend(order[order.find(' '):].split('where'))  #li_order[1]为字段位,li_order[2]为条件判断位置
        if '>' in li_order[2]:   #当条件是>号时,条件位的处理
           li_order[2]=[i.strip() for i in li_order[2].strip().split('>')]
           li_order[2].insert(1,'>')
        elif '='in li_order[2]:          #当条件是'='号时,条件位的处理
            li_order[2]=[i.strip() for i in li_order[2].strip().split('=')]
            li_order[2].insert(1,'=')
        elif '<'in li_order[2]:          #当条件是<号时,条件位的处理
            li_order[2]=[i.strip() for i in li_order[2].strip().split('<')]
            li_order[2].insert(1,'<')
        elif 'like'in li_order[2]:       #当条件是like号时,条件位的处理
            li_order[2]=[i.strip() for i in li_order[2].strip().split('like')]
            li_order[2].insert(1,'like')
        else:
            print('输入的命令有误,请重新输入!')
            continue
        li_order[2][0]=fieldtoid(li_order[2][0])  #将条件的列名转换为下标
    else:
        li_order.append(order[order.find(' '):].strip())
        li_order.append('')
    li_order[1]=(li_order[1].split(','))    #字段位,列表格式

    if 'select' in li_order[0]:
        if fieldtoid(li_order[1][0])!=-1:
            for i in li_order[1]:
                li_order[1][li_order[1].index(i)]=str(fieldtoid(i))
        else:
            if li_order[1][0].strip()!='*':
                print('条件有误')
                continue
        select(li_order)
    elif 'append' in li_order[0]:
       append(li_order)
    elif 'delete' in li_order[0]:
        delete(li_order)
    elif 'set' in li_order[0]:
        sett(li_order)
    else:print('输入的命令有误,请重新输入!')
View Code

员工信息表文件为文本文件,内容如下:

id,name,age,phone,job
1,Alex,22,13651054608,IT
2,Egon,23,13304320533,Tearcher
3,nezha,25,1333235322,IT
4,无,无,13333333333,BOSS

作业没有都做完,如果数据量很大,删除和修改好像很麻烦。数据量小可以写一个新文件然后改名回来即可。

转载于:https://www.cnblogs.com/happypig/p/Eva_J.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值