Day04 - 作业

2016-12-17  本文已影响0人  乘风逐月

作业:员工信息表程序

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

  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("请输入正确的格式!")
上一篇下一篇

猜你喜欢

热点阅读