周末大作业:实现员工信息表
文件存储格式如下:
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来修改列名对应的值为“新的值”

注意:要想操作员工信息表,必须先登录,登陆认证需要用装饰器完成
其他需求尽量用函数实现

import os
name_list = ['id', 'name', 'age', 'phone', 'job'] #创建列名列表
ditons=['>','<','=','like']
user_dic={'name':'admin','passwd':''}
status={'name':None,'passwd':False,'login':False}
def auth(x):
def user_auth(*args,**kwargs):
if not status['login']:#获取user_dic字典里面的login值
username=input('请输入用户名')
userpasswd=input('请输入密码')
if username==user_dic['name'] and userpasswd==user_dic['passwd']:#判断账户密码是否正确
status['name']=username #如果正确修改user_dic里面的信息
status['passwd']=userpasswd
status['login']=True
print('登陆成功')
res=x(*args,**kwargs)
return res
else:
print('用户名或密码输入错误')
else:#如果login为True,直接执行函数
res=x(*args,**kwargs)
return res
return user_auth#函数闭包 def check():
s=input('请输入查询语句,例如 select * where age=25\n')
if 'select' and 'where'in s:#检查输入语句是否正确
content, condition = s.split('where') #以where分割s,并且赋值给content,condition
content = ''.join(content.split('select')[1:]) #content 以select分割,取最后一个赋值给content
if content.strip() and condition.strip(): #判断 如果content 和condition都不为空,执行下面语句
for key in ditons: #for循环遍历ditions,
if key in condition: #如果key 在condition里面的话,执行下列语句
index_condition = ditons.index(key)#获取key在ditons里面的索引
name, cond = condition.strip().split(key)#以key分割condition,赋值给name,cond
if name in name_list:#如果name在name_list里面,执行下列语句
with open('mysql', encoding='utf-8') as f: # r模式打开员工信息表
for line in f: # 逐行循环
if line.strip(): # 如果这一行不为空
line_list = line.strip().replace(',', ',').split(',')#将line以逗号分割以列表形式赋值给line_list,
if key == ">" and int(line_list[name_list.index(name)]) > int(cond): #如果key为> 且列表对应索引的值大于查询语句的值,那么就执行下面语句
if content.strip() == '*':#如果content为*,也就是全部打印
print(line.strip()) #打印line
else:
if ',' in content:#如果逗号在content里面,意味着打印多个,不打印全部
str1 = '' #定义一个空字符串
select_name_list = content.strip().split(',') #content 以逗号分割,以列表的形式赋值给select_name_list
select_name_list = [i for i in select_name_list if i != ''] #去掉select_name_list 的空字符串
for names in select_name_list:#for 循环select_name_list
names_index = name_list.index(names.strip())#找到关键字的索引
str1 = str1 + line_list[names_index] + ',' #赋值给str1
print(str1)#打印
else:
print(line_list[name_list.index(content.strip())])#如果不存在逗号,只打印单个,直接找到索引打印即可
if key == "<" and int(line_list[name_list.index(name)]) < int(cond):
if content.strip() == '*':
print(line.strip())
else:
if ',' in content:
str1 = ''
select_name_list = content.strip().split(',')
select_name_list = [i for i in select_name_list if i != '']
for names in select_name_list:
names_index = name_list.index(names.strip())
str1 = str1 + line_list[names_index] + ','
print(str1)
else:
print(line_list[name_list.index(content.strip())])
if key == "=" and line_list[name_list.index(name)] == cond:
if content.strip() == '*':
print(line.strip())
else:
if ',' in content:
str1 = ''
select_name_list = content.strip().split(',')
select_name_list = [i for i in select_name_list if i != '']
for names in select_name_list:
names_index = name_list.index(names.strip())
str1 = str1 + line_list[names_index] + ','
print(str1)
else:
print(line_list[name_list.index(content.strip())])
if key == 'like':
name = name.strip()
cond = cond.strip()
key = key.strip()
if cond in line_list[name_list.index(name)]:
if content.strip() == '*':
print(line.strip())
else:
if ',' in content:
str1 = ''
select_name_list = content.strip().split(',')
select_name_list = [i for i in select_name_list if i != '']
for names in select_name_list:
names_index = name_list.index(names.strip())
str1 = str1 + line_list[names_index] + ','
print(str1)
else:
print(line_list[name_list.index(content.strip())])
else:
print('查无关键字')
else:
print('语句格式错误')
else:
print('查询语句输入错误') def delete():
s=input('请输入要删除的ID,例如:delete * where id=1\n')
if 'delete' and 'where ' in s:
flag = False
delete_content,delete_cond=s.strip().split('where')#以where分割
if delete_content.strip() and delete_cond.strip():#判断delete_content和delete_cond是否都不为空,不为空执行下面语句
name, value = delete_cond.strip().split('=')#以=分割
with open('mysql', 'r', encoding='utf-8') as f:#打开文件
for line in f: #for循环文件内容
if line.strip():#如果内容不为空
line_list = line.strip().split(',')#以逗号分割,以列表的形式赋值给line_list
if line_list[name_list.index(name.strip())] == value.strip():#如果要更新的值和文件中对应索引的值匹配,执行下面语句
flag=True#flag改为True
if flag:#如果flag为True 执行下列语句
with open('mysql', 'r', encoding='utf-8') as f, open('mysql.bak', 'a', encoding='utf-8') as f1:#打开文件
for line in f:
if line.strip():
line_list = line.strip().split(',')
if line_list[name_list.index(name.strip())] != value.strip():#如果更新的值和文件中不匹配,就将内容写入新文件,匹配就不写入
f1.write(line)
if flag:#flag为True才会去删除文件,和重命名文件
os.remove('mysql')
os.rename('mysql.bak', 'mysql')
if not flag:#如果flag为True就不执行,为False就执行
print('找不到相应数据')
else:
print('语句格式错误')
else:
print('输入错误')
def add():
s=input('请输入要添加的信息,例如 add children,26,1501375,Student\n')
add_user=s.strip().split('add ')#以add+空格分割
user_str=''#定义空字符串
for i in add_user:#因为add_user是列表,所以用for循环转为字符串
user_str+=i
user_id=0#定义值,用于获取id
with open('mysql','r',encoding='utf-8') as f:#打开文件
for line in f:#for循环文件
if line.strip():
line_list = line.strip().split(',')
if int(line_list[0]) >= int(user_id):#文件内的id与user_id进行比较,如果文件内的id大,执行下面语句
user_id = int(line_list[0])#赋值给我们定义的user_id
user_id += 1#user_id 自加1
with open('mysql', 'a', encoding='utf-8') as f1:#打开新文件
f1.write('\n'+str(user_id)+','+user_str)#写入内容
print('添加成功') def update():
s=input('请输入要修改的数据,例如:set age=100 where name=chen\n')
if 'set' and 'where' in s:
flag=False
content, condition = s.split('where')#以where分割
content=''.join(content.split('set '))#以set+空格分割
if content.strip() and condition.strip():#判断是否都不为空,不为空就执行下列语句
update_name, update_value = content.strip().split('=')#以=分割,赋值给update_name,updata_value,这是要更新的值
name, value = condition.strip().split('=')#以=分割,赋值给name,vlue,这是条件
with open('mysql', encoding='utf-8') as f:#打开文件
for line in f:
if line.strip():
line_list = line.strip().split(',')#以逗号的形式分割成列表
if line_list[name_list.index(name.strip())] == value:#如果列表里面的值等于条件的值,执行下面语句
flag = True
if flag:#如果flag 为True的话,执行下列语句
with open('mysql', encoding='utf-8') as f, open('mysql.bak', 'w', encoding='utf-8') as f1:#打开文件
for line in f:
if line.strip():
line_list = line.strip().split(',')
if line_list[name_list.index(name.strip())] == value:#如果列表中的值等于条件的值
line_list[name_list.index(update_name.strip())] = update_value#那么就直接将对应索引位置的值修改为更新的值
f1.write(','.join(line_list) + '\n')#写入文件
print('更新成功')
else:#如果不等于条件的值
f1.write(line)#直接写入
if flag:#如果flag为True,才要删除和重命名,为False,则不用
os.remove('mysql')
os.rename('mysql.bak', 'mysql')
if not flag:
print('无法找到相对应的数据')
else:
print('语句格式错误')
else:
print('输入错误') @auth
def main():
msg={
'':check,
'':delete,
'':add,
'':update
}
print('''
1:查询
2:删除
3:添加
4:更新
''')
num=input('请选择要执行的操作\n')
msg[num]()
while __name__=='__main__':
main()

python练习题-员工信息表的更多相关文章

  1. python作业员工信息表程序(第四周)

    作业需求: 1. 员工信息表程序,实现增删改查操作: 2. 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 ...

  2. day12 python作业:员工信息表

    作业要求: 周末大作业:实现员工信息表文件存储格式如下:id,name,age,phone,job1,Alex,22,13651054608,IT2,Egon,23,13304320533,Tearc ...

  3. python写员工信息表作业笔记

    需求 流程图

  4. python-查询员工信息表

    python查询员工信息表 基本要求: 用户可以模糊查询员工信息 显示匹配了多少条,匹配字符需要高亮显示 代码: #!/usr/env python #coding:utf-8 import time ...

  5. python基础之员工信息表作业

    周末大礼包 文件存储格式如下: id, name, age, phone, job 1, Alex, 22, 13651054608, IT 2, Egon, 23, 13304320533, Tea ...

  6. python's sixteenth day for me 员工信息表

    import os user_dic = { 'username':None, 'password':None, 'login':True } flag = False name_list = ['i ...

  7. python-打印简单公司员工信息表

    python-打印简单公司员工信息表 要求,输入name不为空,输入次数最多3次,3次后跳出程序: 知识点: raw_input str转int whil if elif else continue ...

  8. python3 员工信息表

    这是最后一条NLP了......来吧 十二,动机和情绪总不会错,只是行为没有效果而已 动机在潜意识里,总是正面的.潜意识从来不会伤害自己,只会误会的以为某行为可以满足该动机,而又不知道有其他做法的可能 ...

  9. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

随机推荐

  1. MySQL server has gone away 的两个最常见的可能性

    [背景] 今天测试同学反馈他们docker中的测试库时不时就就报“MySQL server has gone away”,事态之紧急搞的我都有点怕了(像我这么成熟稳重 的DBA怎么有可能怕呢): 第一 ...

  2. Atitit 数据库排除某一列 字段 显示

    Atitit  数据库排除某一列 字段  显示 GROUP_CONCAT  行列转换 mysql利用group_concat()合并多行数据到一行_Mysql_脚本之家 sELECT GROUP_CO ...

  3. kubernetes 学习资料

    谷歌大神详解 Kubernetes 配置管理最佳方法 https://www.kubernetes.org.cn/3031.html all in on kubernetes https://gith ...

  4. rdesktop使用记录

    常用命令 连接远程windows RDP服务器,映射本机/home/ssooking/share/目录到windows上,名称为Myshare. rdesktop -a 16 -u xxx -p xx ...

  5. Mysql优化-大数据量下的分页策略

    一.前言 通常,我们分页时怎么实现呢? 1 SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但是,数据量猛增以后呢? 1 SELECT * FROM t ...

  6. 深入理解Java类加载器(ClassLoader)

    深入理解Java类加载器(ClassLoader) Java学习记录--委派模型与类加载器 关于Java类加载双亲委派机制的思考(附一道面试题) 真正理解线程上下文类加载器(多案例分析) [jvm解析 ...

  7. there was an error running the selected code generator unable to retrieve metadata for

    there was an error running the selected code generator unable to retrieve metadata for PROBLEM: I ha ...

  8. springmvc 返回 404 解决

    Idea Maven springmvc spring 项目搭建中/url 可以访问controller,并且能返回正确的ModelAndView,但是页面总是显示404 项目结构: web.xml ...

  9. Android8 自定义广播接收不到的问题

    最近在用安卓广播的时候,按照流程进行操作,可是不管怎样都没有出现我接受的广播,网上查阅资料以后,发现在Android8中,如果是静态注册广播,需要在action中保留原来的静态广播,加入Compone ...

  10. Cocoapods 创建自己的公开库、私有库

    如何创建自己的共有库 1.注册Trunk trunk需要CocoaPods 0.33版本以上,用pod --version 命令查看版本 CocoaPods版本 如果版本低,需要升级: sudo ge ...