作业大礼包——员工信息表
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文件,对作业进行一些简单说明,包括作业的整体思路,如何运行,实现了哪些功能,遇到了哪些问题等。)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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('输入的命令有误,请重新输入!')
员工信息表文件为文本文件,内容如下:
id,name,age,phone,job
1,Alex,22,13651054608,IT
2,Egon,23,13304320533,Tearcher
3,nezha,25,1333235322,IT
4,无,无,13333333333,BOSS
作业没有都做完,如果数据量很大,删除和修改好像很麻烦。数据量小可以写一个新文件然后改名回来即可。