python实现员工信息表增删改查
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现员工信息表增删改查相关的知识,希望对你有一定的参考价值。
程序说明:模拟实现sql语句的增删改查
关键是怎么去实现这个事情,从哪儿下手,网上的代码挺多的,这个比较好,最好自己画一个流程图,这样写起来就比较方便,自己写了一遍代码,有问题的可以联系,刚开始学习python,共同学习
实现功能如下
[x] 模糊查询
[x] 创建员工纪录
[x] 删除员工纪录
[x] 修改员工纪录
说下看别人写的代码:自己刚开始也没有思路,慢慢的看一些视频就是一点 一点的完成一个功能模块,
先写一个基础的框架:
最开始就是写的读文件,因为数据一般都存放在文件或者数据库,所以要先写这个,就用到了with open()处理文件
这个时候写完了就联系了文件的读及把读取的数据按格式处理,
玩了就写python的数据对象如何保存到文件,一样也是联系文件的处理,
这样新增数据就可以实现了
记得写完功能模块一定要先测试
写完代码记得测试:
test_list = "add [Alex Li,22,13651054666,IT,2013-04-01]"
struct_list,data_list = file_to_data("staff_table")
table = "staff_table"
add(test_list,struct_list,data_list,table)
玩了就写删除模块,一样写完了记得测试
#!/usr/bin/env python
#_*_coding:utf-8_*_
import os
import sys
def file_to_data(table):
"""
#把文件转换为python对象
:param table:
:return:
"""
num = 0
data_list = []
with open(table,"r+",encoding="utf-8") as f:
for line in f:
line = line.strip()
line_list = line.split(",")
if num == 0:
struct_list = line_list
else:
data_list.append(line_list)
num = num + 1
return struct_list,data_list
#写完一个功能模块记得可以先测试一下
#struct_list,data_list = file_to_data("staff_table")
#print(struct_list)
#print(data_list)
def auto_increment_id(data_list):
file = "auto_increment_id"
max_staff_id = int(data_list[-1][0]) # 表中最大的staff_id
id = 0 # 初始化
if os.path.exists(file): # 自增id文件存在时
with open(file, "r+") as f:
for line in f:
id = int(line)
if max_staff_id <= id:
new_staff_id = id + 1
else:
new_staff_id = max_staff_id + 1
with open(file, "w+") as f:
f.write(str(new_staff_id))
return new_staff_id
def data_to_file(struct_list, data_list, table):
with open(table,"w+",encoding="utf-8") as f:
f.write(",".join(struct_list) + "\n")
for sub_list in data_list:
f.write(",".join(sub_list) +"\n")
print("Done !!!")
def add(sql, struct_list, data_list, table):
# sql: Alex Li,22,13651054608,IT,2013-04-01
input_info = sql.strip().strip("add [").strip("]")
new_list = input_info.split(",")
phone = new_list[2]
phone_exist = False
for d_list in data_list:
if phone == d_list[3]:
phone_exist = True
if phone_exist is True:
print("The phone is exists ,can‘t Add !!!")
return True
else:
new_staff_id = auto_increment_id(data_list)
new_list.insert(0,str(new_staff_id))
data_list.append(new_list)
data_to_file(struct_list,data_list,table)
#写完代码记得测试
#test_list = "add [Alex Li,22,13651054666,IT,2013-04-01]"
#struct_list,data_list = file_to_data("staff_table")
#table = "staff_table"
#add(test_list,struct_list,data_list,table)
def sql_to_list(sql):
tmp_sql = sql.split(‘ ‘)
sql_list = []
tmp = ‘‘
flag = 1 #列表添加元素标识
for l in tmp_sql:
if l.startswith(‘"‘) and l.endswith(‘"‘):
flag = 1
elif l.startswith(‘"‘) and (not l.endswith(‘"‘)):
flag = 0
tmp = l + ‘ ‘
elif (not l.startswith(‘"‘)) and (not l.endswith(‘"‘)):
if flag == 0:
l += ‘ ‘
tmp += l
else:
flag = 1
elif (not l.startswith(‘"‘)) and l.endswith(‘"‘):
if flag == 0:
tmp += l
flag = 1
sql_list.append(tmp)
continue
if flag == 1:
sql_list.append(l)
return sql_list
def delete(sql, struct_list, data_list, table):
delete_flag = False
input_info = sql_to_list(sql)
staff_id = input_info[1]
for d_list in data_list:
if d_list[0] == staff_id:
delete_flag = True
data_list.remove(d_list)
if delete_flag is not True:
print("The staff_id is not exist,can‘t delete")
else:
data_to_file(struct_list,data_list,table)
#写完代码记得测试
#struct_list,data_list = file_to_data("staff_table")
#table = "staff_table"
#sql="delete 5"
#delete(sql,struct_list,data_list,table)
def check_quotes(str):
"""
:param str: 需要处理的字符串
:return: 返回无符号的字符串
"""
if ‘"‘ in str:
str = str.strip(‘"‘)
return str
def print_help():
print("\tselect * from staff_table;")
print("\tselect name,age from staff_table where age > 22;")
print("\tselect * from staff_table where dept = \"IT\";")
print("\tselect * from staff_table where enroll_date like \"2013\";")
print("\tadd [Alex Li,22,13651054608,IT,2013-04-01];")
print("\tupdate staff_table set dept = \"Market\" where dept = \"IT\";")
print("\tdelete 5;")
def get_column_number(column, struct_list):
"""
# 获取列位置
:param column: 列名,此处只实现支持一个
:return:
"""
column_number = struct_list.index(column) # 结果为数字
return column_number
def input_sql():
# 获取输入SQL
exit_flag = False
while exit_flag is not True:
print("-".center(60, "-"))
print("Tip: Input 【help [select/update/add/delete]】 to get help.")
print("-".center(60, "-"))
print_help()
sql = input("Please input SQL:").strip().strip(";")
if sql.startswith(‘help‘):
action = sql.split(" ")[1]
print_help(action)
continue
if sql == "q" or sql == "quit":
exit(" Bye Bye ".center(60, "#"))
exit_flag = True
return sql
def check_table(table, c_table):
"""
# 判断表是否存在
:param table: 表名
:return:
"""
if table != c_table:
print("Your input table \033[31m{}\033[0m is not exists,"
"please check!".format(c_table))
print("#".center(60, "#"))
return True # 标记给continue_flagdef check_quotes(str):
def analyze(sql):
input_info = sql_to_list(sql)
# return input_info
action = input_info[0] # 查:select;增:add;改:update;删:delete
return action
def select(sql, struct_list, data_list, table): # select sql语法分析
input_info = sql_to_list(sql)
select_column = input_info[1].split(",")
try:
table_name = input_info[3]
except Exception as e:
print("Your input is error!!!")
return True
continue_flag = check_table(table,table_name)
if continue_flag is True:
return True
all_column = False
all_line = False
if "*" in select_column:
all_column = True
else:
column_numbers = []
print(select_column)
for s_column in select_column:
s_number = get_column_number(s_column,struct_list)
column_numbers.append(s_number)
if "where" in sql:
# 由于双引号问题,此处加上双引号
where_flag = input_info[4] # where
condition_column = input_info[5] # 条件字段
condition_str = input_info[6] # 限制条件关键字,支持“=”,“>=”,“like”等
condition_value = input_info[7] # 条件参数
condition_value = check_quotes(condition_value) # 去除双引号
column_number = get_column_number(condition_column, struct_list) # 列位置
match_data_list = [] # 匹配出来的结果,列表格式,
# 查询行,有like、>=、= 等
if where_flag == "where": # 有where
if condition_str == "like":
# like
for line in data_list: # line也是列表
if condition_value in line[column_number]: # 匹配like
match_data_list.append(line)
elif condition_str == "=":
for line in data_list:
if line[column_number] == condition_value:
match_data_list.append(line)
elif condition_str == ">":
for line in data_list:
if line[column_number] > condition_value:
match_data_list.append(line)
elif condition_str == ">=":
for line in data_list:
if line[column_number] >= condition_value:
match_data_list.append(line)
elif condition_str == "<":
for line in data_list:
if line[column_number] < condition_value:
match_data_list.append(line)
elif condition_str == "<=":
for line in data_list:
if line[column_number] <= condition_value:
match_data_list.append(line)
else: # 无where,取所有行
all_line = True
match_data_list = data_list
# 打印结果
print("The select result:")
print("#".center(60, "#"))
print("\033[32m{}\033[0m rows in set".format(len(match_data_list)))
if all_column is True:
print("{:>8} {:>8} {:>8} {:>8} {:>8} {:>8}".format(*struct_list))
for line in match_data_list:
print("{:>8} {:>8} {:>8} {:>8} {:>8} {:>8}".format(*line))
else:
len_num = len(select_column)
format_str = ‘{:>8} ‘ * len_num
print(format_str.format(*select_column))
for line in match_data_list:
line_list = []
for s in column_numbers:
line_list.append(line[s])
print(format_str.format(*line_list))
print("#".center(60, "#"))
def update(sql, struct_list, data_list, table):
# update staff_table set dept = "Market" where dept = "IT"; 只允许修改age,phone,dept,enroll_date
input_info = sql_to_list(sql)
table_name = input_info[1]
table_name = input_info[1]
set_flag = input_info[2]
modify_column = input_info[3] # 修改的字段
equal_flag = input_info[4] # 等于符号
modify_value = input_info[5] # 修改后的值
modify_value = check_quotes(modify_value) # 去除双引号
where_flag = input_info[6]
condition_column = input_info[7] # 条件字段
condition_str = input_info[8] # 限制条件关键字,只支持“=”
condition_value = input_info[9] # 条件参数
condition_value = check_quotes(condition_value) # 去除双引号
modify_column_number = get_column_number(modify_column, struct_list) # 列位置
condition_column_number = get_column_number(condition_column, struct_list)
modify_flag = False
continue_flag = check_table(table, table_name)
if continue_flag is True:
return True
if set_flag == "set" and equal_flag == "=" and where_flag == "where" and condition_str == "=":
phone_exist = False
phone = modify_value
for d_list in data_list:
if phone == d_list[3]:
phone_exist = True
if phone_exist is True:
print("Thone phone is exist,can‘t update.")
return True
for d_list in data_list:
# 由于双引号问题,此处加上双引号
if d_list[condition_column_number] == condition_value:
d_list[modify_column_number] = modify_value
modify_flag = True
if modify_flag is not True:
print("Not match any record!")
else:
data_to_file(struct_list, data_list, table)
else:
print("Your input is error!")
#写完代码记得测试
#sql = input()
#struct_list,data_list = file_to_data("staff_table")
#table = "staff_table"
#update(sql,struct_list,data_list,table)
def main():
exit_flag = False
table = "staff_table"
while exit_flag is not True:
sql = input_sql()
action = analyze(sql)
struct_list, data_list = file_to_data(table)
if action == "select":
continue_flag = select(sql, struct_list, data_list, table)
if continue_flag is True:
continue # 重新循环
elif action == "add":
continue_flag = add(sql, struct_list, data_list, table)
if continue_flag is True:
continue # 重新循环
elif action == "update":
continue_flag = update(sql, struct_list, data_list, table)
if continue_flag is True:
continue
elif action == "delete":
delete(sql, struct_list, data_list, table)
else:
print("Your input error!")
if __name__ == ‘__main__‘:
main()
以上是关于python实现员工信息表增删改查的主要内容,如果未能解决你的问题,请参考以下文章
Python3.5 day4作业:对员工信息文件,实现增删改查操作。