Part 2-1 员工信息表

python学习网 2017-06-19 16:30:03

README:

 1. 员工信息表程序,实现增删改查操作:

  1).可进行模糊查询,语法至少支持下面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"
    最后显示有查到的条数
  2).可创建新员工纪录,以phone做唯一键,staff_id需自增
  3).可删除指定员工信息纪录,输入员工id,即可删除
  4).可修改员工信息,语法如下:
    UPDATE staff_table SET dept="Market" WHERE  dept = "IT"

流程图:

 

代码:

# coding:utf8

import sys
import re


def select(staff, field):
    cmd = input("cmd>").strip()
    cmd = cmd.replace('FROM', 'from')
    cmd = cmd.replace('WHERE', 'where')
    if '*' in cmd:
        for i in field.keys():
            sys.stdout.write(str(i) + ' ')
        print('')
    for line in staff:
        info_list = re.split(r',+', line.strip('\n'))
        cmd_list = re.split(r'[ ,;]+', cmd)
        f_index = cmd_list.index('from')
        search_field = cmd_list[1:f_index]
        from_field = cmd_list[f_index + 1]
        if from_field != 'staff_table':
            print('\033[31;1mplease select `staff_table`...\033[0m')
            break
        if 'where' not in cmd_list:
            # 不存在where条件,显示所有
            view_list = []
            for i in range(len(search_field)):
                if search_field[i] == '*':
                    view_list = info_list[:]
                else:
                    view_list.append(info_list[field.get(search_field[i])])
            else:
                print(','.join(view_list))
        else:
            # 存在where条件
            w_index = cmd_list.index('where')
            where_str = ''.join(cmd_list[w_index + 1:])
            if re.search(r'like', where_str):
                sizeof = 'like'
                where_list = re.split(r'like', where_str)
            else:
                sizeof = re.search(r'[=><]+', where_str).group()
                where_list = re.split(r'[=><]+', where_str)
            where_field = where_list[0]
            value = where_list[1]
            if re.search(r'[\'\"]+', value):  # 带'和"的表示字符,处理掉'和"
                value = value.replace('\"', '')
                value = value.replace('\'', '')
            else:
                value = float(value)
            # print(where_str, where_field, sizeof, value)
            # 条件判断 >, <, =, like
            if sizeof == '>':
                v = info_list[field.get(where_field)]
                if float(v) > value:
                    view_list = []
                    for i in range(len(search_field)):
                        if search_field[i] == '*':
                            view_list = info_list[:]
                        else:
                            view_list.append(info_list[field.get(search_field[i])])
                    else:
                        print(','.join(view_list))
            elif sizeof == '<':
                v = info_list[field.get(where_field)]
                if float(v) < value:
                    view_list = []
                    for i in range(len(search_field)):
                        if search_field[i] == '*':
                            view_list = info_list[:]
                        else:
                            view_list.append(info_list[field.get(search_field[i])])
                    else:
                        print(','.join(view_list))
            elif sizeof == '=':
                v = info_list[field.get(where_field)]
                if field.get(where_field) == 2:
                    v = float(v)
                if v == value:
                    view_list = []
                    for i in range(len(search_field)):
                        if search_field[i] == '*':
                            view_list = info_list[:]
                        else:
                            view_list.append(info_list[field.get(search_field[i])])
                    else:
                        print(','.join(view_list))
            elif sizeof == 'like':
                v = info_list[field.get(where_field)]
                if value in v:
                    view_list = []
                    for i in range(len(search_field)):
                        if search_field[i] == '*':
                            view_list = info_list[:]
                        else:
                            view_list.append(info_list[field.get(search_field[i])])
                    else:
                        print(','.join(view_list))
            else:
                pass


def add(staff):
    staff.sort()
    num = int(re.split(r',', staff[-1])[0]) + 1
    phone = input("phone:").strip()
    for line in staff:
        if phone == line[3]:
            print("already exists...")
            return False
    if not re.match(r'^\d+$', phone) or len(phone) < 7:
        print("format error...")
        return False
    name = input("name:").strip()
    age = input("age:").strip()
    dept = input("dept:").strip()
    enroll_date = input("enroll_date:").strip()
    for s in (name, age, dept, enroll_date):
        if not len(s):
            print("input is null...")
            return False
    else:
        staff.append('%s,%s,%s,%s,%s,%s\n' % (num, name, age, phone, dept, enroll_date))
        return staff


def update(staff, field):
    cmd = input("cmd>").strip()
    up_list = []
    cmd = cmd.replace('SET', 'set')
    cmd = cmd.replace('WHERE', 'where')
    for line in staff:
        info_list = re.split(r',+', line.strip('\n'))
        cmd_list = re.split(r'[ ,;]+', cmd)
        if cmd_list[1] != 'staff_table':
            print('\033[31;1mplease update `staff_table`...\033[0m')
            break
        set_index = cmd_list.index('set')
        where_index = cmd_list.index('where')
        set_list = re.split(r'=', ''.join(cmd_list[set_index + 1:where_index]))
        set_field = set_list[0]
        set_value = set_list[1]
        if re.search(r'[\'\"]+', set_value):
            set_value = set_value.replace('\'', '')
            set_value = set_value.replace('\"', '')
        where_list = re.split(r'=', ''.join(cmd_list[where_index + 1:]))
        where_field = where_list[0]
        where_value = where_list[1]
        if re.search(r'[\'\"]+', where_value):
            where_value = where_value.replace('\'', '')
            where_value = where_value.replace('\"', '')
        if info_list[field.get(where_field)] == where_value:
            info_list[field.get(set_field)] = set_value
            print(','.join(info_list))
        up_list.append(','.join(info_list))
    else:
        return up_list


def delete(staff):
    del_id = input("delete id:").strip()
    for i in range(len(staff)):
        if re.split(r',', staff[i])[0] == del_id:
            staff.pop(i)
            print("id:%s delete success." % del_id)
            return staff
    else:
        return False


def main():
    staff_table = 'staff_table.txt'
    field = {
        'staff_id': 0,
        'name': 1,
        'age': 2,
        'phone': 3,
        'dept': 4,
        'enroll_date': 5
    }
    menu = '''\033[33;1m-- staff_table --\033[0m\033[29;1m
S. 查询   h. 帮助
A. 新增   q. 退出
E. 修改
D. 删除\033[0m'''
    print(menu)
    while True:
        try:
            with open(staff_table, 'r') as f:
                staff = f.readlines()
            choice = input(">>").strip().lower()
            if choice == 'h':  # help
                print(menu)
            elif choice == 'q':
                break
            elif choice == 's':  # search
                select(staff, field)
            elif choice == 'a':  # add
                result = add(staff)
                if not result:
                    print('\033[31;1madd failed...\033[0m')
                    continue
                else:
                    with open(staff_table, 'w') as f:
                        f.writelines(result)
            elif choice == 'e':  # update
                result = update(staff, field)
                if not result:
                    print('\033[31;1mupdate failed...\033[0m')
                    continue
                else:
                    with open(staff_table, 'w') as f:
                        for line in result:
                            f.write(line + '\n')
            elif choice == 'd':  # delete
                result = delete(staff)
                if not result:
                    print('\033[31;1mdelete failed...\033[0m')
                    continue
                else:
                    with open(staff_table, 'w') as f:
                        f.writelines(result)
            else:
                continue
        except:
            print("\033[31;1minput error...\033[0m")
            continue


if __name__ == '__main__':
    main()
View Code

 

阅读(805) 评论(0)