zoukankan      html  css  js  c++  java
  • python练习题-员工信息表

    周末大作业:实现员工信息表
    文件存储格式如下:
    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':'123456'}
    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
    ')
        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
    ')
        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
    ')
        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('
    '+str(user_id)+','+user_str)#写入内容
        print('添加成功')
     
    def update():
        s=input('请输入要修改的数据,例如:set age=100 where name=chen
    ')
        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) + '
    ')#写入文件
                                    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={
            '1':check,
            '2':delete,
            '3':add,
            '4':update
        }
        print('''
            1:查询
            2:删除
            3:添加
            4:更新
        ''')
        num=input('请选择要执行的操作
    ')
        msg[num]()
    while __name__=='__main__':
        main()
  • 相关阅读:
    如何把textfield或者textview中长按出现的(全选,复制,粘贴)显示成中文
    免费真机调试 -- Xcode7
    Android性能测试工具 Emmagee
    iOS 开发 入门:使用Ad Hoc 进行用户测试
    栈与队列的区别
    iOS中ASI和AFN的区别
    iOS开发之监测网络状态
    xcode设置项目图标玻璃镜效果
    isEqual,isEqualTostring,==三者的区别
    iphone匹配邮箱的正则表达式
  • 原文地址:https://www.cnblogs.com/fumy/p/10353130.html
Copyright © 2011-2022 走看看