Day04 - 作业

作业:员工信息表程序

一、作业要求:详细描述参考

  1. 实现增删改查操作:
  2. 可进行模糊查询,语法至少支持下面3种:
    select name,age from staff_table where age > 22
    select * from staff_table where dept = "IT"
    select * from staff_table where enroll_date like "2013"
  3. 查到的信息,打印后,最后面还要显示查到的条数
  4. 可创建新员工纪录,以phone做唯一键,staff_id需自增
  5. 可删除指定员工信息纪录,输入员工id,即可删除
  6. 可修改员工信息,语法如下:
    UPDATE staff_table SET dept = "Market" WHERE where dept = "IT"
staff_id,name,age,phone,dept,enroll_date
1,Alex Li,22,13651054608,IT,2013-04-01
2,Jack Wang,30,13304320533,HR,2015-05-03
3,Rain Liu,25,1383235322,Sales,2016-04-22
4,Mack Cao,40,1356145343,HR,2009-03-01

注意:以上需求,要充分使用函数,请尽你的最大限度来减少重复代码

二、简单思路

  1. 模糊查询在用户输入后按空格切分存为列表,按照下标来提取查询关键字。
  2. 查询到的信息,存至列表,根据元素数量来显示条数。
  3. 在for循环现有员工信息后,将所有人phone信息存为列表,待查。

三、流程图

Day04 - 员工信息表

四、参考站点

1 | 2 | 3

五、代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import shutil
import time

def staff_info(func_type):
    def backup(func):
        def re_name(*args, **kwargs):
            if func_type != 'search_type':  # 判断是否备份
                backup_time = time.strftime('%Y%m%d_%H%M%S')
                shutil.copyfile('staff_info', 'staff_info_%s.bak' % backup_time)
                print("原员工信息已备份为 staff_info_%s.bak" % backup_time)
            print("已有员工:")
            with open('staff_info', 'r', encoding='utf-8') as f:  # 打印已有员工信息
                for line in f:
                    line = line.strip().split(',')
                    print('| ' + ' | '.join(line) + ' |')
            res = func(*args, **kwargs)
            if func_type in ['mod_type', 'del_type'] and os.path.exists('staff_info_new'):   # 重命名文件
                os.remove('staff_info')
                os.rename('staff_info_new', 'staff_info')
            return res
        return re_name
    return backup

@staff_info(func_type='search_type')
def search():
    user_search = input("请输入模糊查询语句:").strip()
    search_list = user_search.split(' ')  # 将条件语法以空格拆分为列表
    found_info = []  # 搜索结果
    with open('staff_info', 'r', encoding='utf-8') as f:
        for line in f:
            user_info = line.strip().split(',')  # 循环出员工信息
            conditional = '%s %s %s' % (user_info[2], search_list[6], search_list[7])  # 将条件字符串写入变量
            if search_list[6] == '=':  # 如果是等号就替换
                conditional = conditional.replace('=', '==')
            # 用语句关键字匹配,用 eval() 将字符串转换为判断条件
            if search_list[5] == 'age' and user_info[0].isdigit() and eval(conditional):
                found_info.append([user_info[1], user_info[2]])
            elif search_list[5] == 'dept' and user_info[4] in search_list[7]:
                found_info.append(user_info)
            # 匹配后,切片出用户信息列表中的年份与语法中的年份对比
            elif search_list[5] == 'enroll_date' and user_info[5][0:4] in search_list[7]:
                found_info.append(user_info)
        if not found_info:
            print("没有找到你要搜索的员工!\n")
        else:
            print("找到以下员工的信息:\n")
            for i in found_info:
                print(' | '.join(i))
            print("\n共计找到 %d 条信息\n" % len(found_info))
    return found_info

@staff_info(func_type='add_type')
def add():
    user_add = input("请输入您要增加的员工信息(注意格式):").strip()
    add_list = user_add.split(',')  # 以 , 拆分为列表
    phone = []
    with open('staff_info', 'r+', encoding='utf-8') as f:
        user_id = 0  # 员工id变量
        for line in f:
            user_info = line.strip().split(',')  # 循环出员工信息
            phone.append(user_info[3])
            if user_info[0].isdigit() and user_id < int(user_info[0]):  # 判断是否要给员工id变量赋值
                user_id = int(user_info[0])
        if add_list[2] not in phone:
            f.write('\n' + str(user_id + 1) + ',' + ','.join(add_list))
            print("员工 %s 的信息已添加成功!\n" % add_list[0])
        else:
            print("您要添加的员工信息已存在!\n")

@staff_info(func_type='mod_type')
def modify():
    user_mod = input("请输入修改员工信息的语法:").strip()
    mod_list = user_mod.split(' ')
    user_list = []
    mod_flag = False
    with open('staff_info', 'r', encoding='utf-8') as f,\
                open('staff_info_new', 'w', encoding='utf-8') as f2:
        for line in f:
            user_info = line.strip().split(',')
            if user_info[4] in mod_list[10]:
                mod_flag = True
                user_info[4] = mod_list[5].strip('"')
                print("员工 %s 的信息已修改!\n" % user_info[1])
            user_list.append(user_info)
        for list in user_list:
            if not list[0].isdigit():   # 如果list[0]不为数字
                f2.write(','.join(list))
            else:
                f2.write('\n' + ','.join(list))
        if not mod_flag:
            print("没有找到需要修改信息的员工!\n")

@staff_info(func_type='del_type')
def delete():
    user_del = input("请输入您要删除的员工id:").strip()
    if not user_del.isdigit():
        print("请输入正确的员工编号!\n")
        return
    else:
        with open('staff_info', 'r', encoding='utf-8') as f,\
                open('staff_info_new', 'w', encoding='utf-8') as f2:
            for line in f:
                user_info = line.strip().split(',')
                if user_del == user_info[0]:
                    print("已删除员工 %s" % line)
                    continue
                else:  # 切片字符串首个字符,由其是否为数字决定写入格式。
                    if not line[0].isdigit():
                        f2.write(line.strip())
                    else:
                        f2.write('\n' + line.strip())

while True:
    print("""1.模糊查询
2.创建新员工
3.修改员工信息
4.删除员工信息
5.退出
""")
    menu_dict = {'1': search, '2': add, '3': modify, '4': delete}
    user_chosen = input("请输入您想要操作的选项序号:")
    if user_chosen in menu_dict.keys():
        menu_dict[user_chosen]()
    elif user_chosen == '5':
        exit("See you next time!")
    else:
        print("请输入正确的格式!")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • Day04的课程要点记录详细教程地址:Day4 - Python基础4 | python装饰器 一、装饰器 1.1...
    乘风逐月阅读 510评论 0 1
  • 1. 问题的提出## 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出...
    七寸知架构阅读 5,364评论 1 111
  • 今天搜索去台湾需要办理什么证件 其中有一条吸引了我,关于财力证明 其中几条中,我看了一下,也就5w存款证明,这项要...
    七点十二分阅读 317评论 0 0
  • 跟高中同学聊天,不经意总会说到我在他们心里的印象,我总结了一下,大致就归结为拧巴和自卑了,对这个评价我倒是一点儿都...
    孑怡阅读 379评论 0 5
  • 我们 与文字的缘分 不是那么 一点点 一张纸 一枝笔 便可以写尽 人世冷暖 当聪明人 发明了 万能的 搜索引擎 我...
    亚民阅读 124评论 0 0