python实现员工信息表

学习python时,看到的一个题目
第一次写博客, 有误的地方还请大佬们指正,十分感谢~

要求如下
'''
文件存储格式如下:
id,name,age,phone,job(这行不需要写)
1,alice,22,13651156619,IT
2,ben,23,13310321345,Teacher
3,xiaoming,25,1331235342,IT
...

实现增删改查
1.查询:支持三种语法
select 列名1,列名2,... where 列名条件
支持大于小于等于,以及模糊查找(like)
select name,age where age>22 输出年龄大于22的人的名字和年龄
select * where job=IT 输出工作是IT的人的所有信息
select * where phone like 133 输出电话号包含133的人的所有信息

之后的增删改必须先登录,登录认证需要用装饰器完成

2.增:创建新员工记录,id要顺序增加

3.删除指定员工,直接输入员工id或名字即可

4.修改员工信息
语法: set 列名='新的值' where 条件
先用where查找对应人的信息,再用set修改列名对应的值为'新的值'
'''

  1 import os
  2 FLAG = False
  3 tip = True
  4 Account = '登入账号存放位置'
  5 FileName = '员工信息文件存放位置'
  6 def login(func):
  7     def inner(*args, **kwargs):
  8         if FLAG:
  9             ret = func(*args, **kwargs)
 10             return ret
 11         else:
 12             username = input('请登录后执行改操作!\n用户名:')
 13             passwd = input('密码:')
 14             if username and passwd:
 15                 with open(Account,'r',encoding='utf-8') as f:
 16                     read_lines = f.readlines()
 17                 if username == read_lines[0].strip() and passwd == read_lines[1].strip():
 18                     res = func(*args, **kwargs)
 19                     return ['登入成功', res]
 20                 else:
 21                     return '登入失败'
 22             else:
 23                 return '登入失败'
 24     return inner
 25 
 26 @login
 27 def select_operate(rec):
 28     '''
 29     查询操作函数第二版
 30     接收处理后的列表
 31     返回一个表示结果的列表
 32     '''
 33     rol_name = ['id', 'name', 'age', 'phone', 'job', '*']
 34     res = []
 35     def judge(rol_suoyin, tiaojian = rec[3]):
 36         if '>=' in tiaojian:
 37             tiaojian = tiaojian.split('>=')
 38             tiaojian_before = tiaojian[0]
 39             tiaojian_after = tiaojian[1]
 40             if tiaojian_before in rol_name and tiaojian_after.isdigit():
 41                 tiaojian_suoyin = rol_name.index(tiaojian_before)
 42                 with open(FileName, 'r', encoding='utf-8') as f:
 43                     for line in f:
 44                         line = line.strip().split(',')
 45                         if int(line[tiaojian_suoyin]) >= int(tiaojian_after):
 46                             if rol_suoyin == 5:
 47                                 res.append(line)
 48                             else:
 49                                 res.append(line[rol_suoyin])
 50                 return res
 51             else:
 52                 return '条件输入有误'
 53         elif '<=' in tiaojian:
 54             tiaojian = tiaojian.split('<=')
 55             tiaojian_before = tiaojian[0]
 56             tiaojian_after = tiaojian[1]
 57             if tiaojian_before in rol_name and tiaojian_after.isdigit():
 58                 tiaojian_suoyin = rol_name.index(tiaojian_before)
 59                 with open(FileName, 'r', encoding='utf-8') as f:
 60                     for line in f:
 61                         line = line.strip().split(',')
 62                         if int(line[tiaojian_suoyin]) <= int(tiaojian_after):
 63                             if rol_suoyin == 5:
 64                                 res.append(line)
 65                             else:
 66                                 res.append(line[rol_suoyin])
 67                 return res
 68             else:
 69                 return '条件输入有误'
 70         elif '=' in tiaojian:
 71             tiaojian = tiaojian.split('=')
 72             tiaojian_before = tiaojian[0]
 73             tiaojian_after = tiaojian[1]
 74             if tiaojian_before in rol_name:
 75                 tiaojian_suoyin = rol_name.index(tiaojian_before)
 76                 with open(FileName, 'r', encoding='utf-8') as f:
 77                     for line in f:
 78                         line = line.strip().split(',')
 79                         if line[tiaojian_suoyin] == tiaojian_after:
 80                             if rol_suoyin == 5:
 81                                 res.append(line)
 82                             else:
 83                                 res.append(line[rol_suoyin])
 84                 return res
 85             else:
 86                 return '条件输入有误'
 87         elif '>' in tiaojian:
 88             tiaojian = tiaojian.split('>')
 89             tiaojian_before = tiaojian[0]
 90             tiaojian_after = tiaojian[1]
 91             if tiaojian_before in rol_name and tiaojian_after.isdigit():
 92                 tiaojian_suoyin = rol_name.index(tiaojian_before)
 93                 with open(FileName, 'r', encoding='utf-8') as f:
 94                     for line in f:
 95                         line = line.strip().split(',')
 96                         if int(line[tiaojian_suoyin]) > int(tiaojian_after):
 97                             if rol_suoyin == 5:
 98                                 res.append(line)
 99                             else:
100                                 res.append(line[rol_suoyin])
101                 return res
102             else:
103                 return '条件输入有误'
104         elif '<' in tiaojian:
105             tiaojian = tiaojian.split('<')
106             tiaojian_before = tiaojian[0]
107             tiaojian_after = tiaojian[1]
108             if tiaojian_before in rol_name and tiaojian_after.isdigit():
109                 tiaojian_suoyin = rol_name.index(tiaojian_before)
110                 with open(FileName, 'r', encoding='utf-8') as f:
111                     for line in f:
112                         line = line.strip().split(',')
113                         if int(line[tiaojian_suoyin]) < int(tiaojian_after):
114                             if rol_suoyin == 5:
115                                 res.append(line)
116                             else:
117                                 res.append(line[rol_suoyin])
118                 return res
119             else:
120                 return '条件输入有误'
121         else:
122             if rec[4] == 'like':
123                 if tiaojian in rol_name:
124                     tiaojian_suoyin = rol_name.index(tiaojian)
125                     tiaojian_after = rec[5]
126                     with open(FileName, 'r', encoding='utf-8') as f:
127                         for line in f:
128                             line = line.strip().split(',')
129                             if tiaojian_after in line[tiaojian_suoyin]:
130                                 if rol_suoyin == 5:
131                                     res.append(line)
132                                 else:
133                                     res.append(line[rol_suoyin])
134                     return res
135                 else:
136                     return '条件输入有误'
137             else:
138                 return '条件输入有误'
139     if rec[1] in rol_name:
140         return judge(rol_name.index(rec[1]))
141     elif ',' in rec[1]:
142         rol_douhao_list = rec[1].split(',')
143         rol_number = len(rol_douhao_list)
144         dic = {'id': 0, 'name': 0, 'age': 0, 'phone': 0, 'job': 0}
145         judge_list = []
146         tiaojian = rec[3]
147         for i in rol_douhao_list:
148             if i not in rol_name:
149                 return '列名输入有误'
150             dic[i] += 1
151         if rol_number <= 4:
152             if rol_number == 2:
153                 r1, r2 = rol_douhao_list[0], rol_douhao_list[1]
154                 if r1 == r2:
155                     return '列名重复'
156                 rol_suoyin1, rol_suoyin2 = rol_name.index(r1), rol_name.index(r2)
157                 if '>' in tiaojian:
158                     tiaojian = tiaojian.split('>')
159                     tiaojian_before = tiaojian[0]
160                     tiaojian_after = tiaojian[1]
161                     if tiaojian_before in rol_name and tiaojian_after.isdigit():
162                         tiaojian_suoyin = rol_name.index(tiaojian_before)
163                         with open(FileName,'r',encoding='utf-8') as f:
164                             for line in f:
165                                 line = line.strip().split(',')
166                                 if int(line[tiaojian_suoyin]) > int(tiaojian_after):
167                                     res.append([line[rol_suoyin1],line[rol_suoyin2]])
168                         return res
169                     else:
170                         return '条件输入有误'
171                 elif '<' in tiaojian:
172                     tiaojian = tiaojian.split('<')
173                     tiaojian_before = tiaojian[0]
174                     tiaojian_after = tiaojian[1]
175                     if tiaojian_before in rol_name and tiaojian_after.isdigit():
176                         tiaojian_suoyin = rol_name.index(tiaojian_before)
177                         with open(FileName,'r',encoding='utf-8') as f:
178                             for line in f:
179                                 line = line.strip().split(',')
180                                 if int(line[tiaojian_suoyin]) < int(tiaojian_after):
181                                     res.append([line[rol_suoyin1],line[rol_suoyin2]])
182                         return res
183                     else:
184                         return '条件输入有误'
185                 elif '=' in tiaojian:
186                     tiaojian = tiaojian.split('=')
187                     tiaojian_before = tiaojian[0]
188                     tiaojian_after = tiaojian[1]
189                     if tiaojian_before in rol_name:
190                         tiaojian_suoyin = rol_name.index(tiaojian_before)
191                         with open(FileName,'r',encoding='utf-8') as f:
192                             for line in f:
193                                 line = line.strip().split(',')
194                                 if line[tiaojian_suoyin] == tiaojian_after:
195                                     res.append([line[rol_suoyin1],line[rol_suoyin2]])
196                         return res
197                     else:
198                         return '条件输入有误'
199                 else:
200                     if rec[4] == 'like':
201                         if tiaojian in rol_name:
202                             tiaojian_suoyin = rol_name.index(tiaojian)
203                             tiaojian_after = rec[5]
204                             with open(FileName, 'r', encoding='utf-8') as f:
205                                 for line in f:
206                                     line = line.strip().split(',')
207                                     if tiaojian_after in line[tiaojian_suoyin]:
208                                         res.append([line[rol_suoyin1],line[rol_suoyin2]])
209                             return res
210                         else:
211                             return '条件输入有误'
212                     else:
213                         return '条件输入有误'
214             elif rol_number == 3:
215                 r1, r2, r3= rol_douhao_list[0], rol_douhao_list[1], rol_douhao_list[2]
216                 if r1 == r2 or r1 == r3 or r2 == r3:
217                     return '列名重复'
218                 rol_suoyin1, rol_suoyin2, rol_suoyin3 = rol_name.index(r1), rol_name.index(r2), rol_name.index(r3)
219                 if '>' in tiaojian:
220                     tiaojian = tiaojian.split('>')
221                     tiaojian_before = tiaojian[0]
222                     tiaojian_after = tiaojian[1]
223                     if tiaojian_before in rol_name and tiaojian_after.isdigit():
224                         tiaojian_suoyin = rol_name.index(tiaojian_before)
225                         with open(FileName, 'r', encoding='utf-8') as f:
226                             for line in f:
227                                 line = line.strip().split(',')
228                                 if int(line[tiaojian_suoyin]) > int(tiaojian_after):
229                                     res.append([line[rol_suoyin1], line[rol_suoyin2], line[rol_suoyin3]])
230                         return res
231                     else:
232                         return '条件输入有误'
233                 elif '<' in tiaojian:
234                     tiaojian = tiaojian.split('<')
235                     tiaojian_before = tiaojian[0]
236                     tiaojian_after = tiaojian[1]
237                     if tiaojian_before in rol_name and tiaojian_after.isdigit():
238                         tiaojian_suoyin = rol_name.index(tiaojian_before)
239                         with open(FileName, 'r', encoding='utf-8') as f:
240                             for line in f:
241                                 line = line.strip().split(',')
242                                 if int(line[tiaojian_suoyin]) < int(tiaojian_after):
243                                     res.append([line[rol_suoyin1],line[rol_suoyin2], line[rol_suoyin3]])
244                         return res
245                     else:
246                         return '条件输入有误'
247                 elif '=' in tiaojian:
248                     tiaojian = tiaojian.split('=')
249                     tiaojian_before = tiaojian[0]
250                     tiaojian_after = tiaojian[1]
251                     if tiaojian_before in rol_name:
252                         tiaojian_suoyin = rol_name.index(tiaojian_before)
253                         with open(FileName, 'r', encoding='utf-8') as f:
254                             for line in f:
255                                 line = line.strip().split(',')
256                                 if line[tiaojian_suoyin] == tiaojian_after:
257                                     res.append([line[rol_suoyin1],line[rol_suoyin2], line[rol_suoyin3]])
258                         return res
259                     else:
260                         return '条件输入有误'
261                 else:
262                     if rec[4] == 'like':
263                         if tiaojian in rol_name:
264                             tiaojian_suoyin = rol_name.index(tiaojian)
265                             tiaojian_after = rec[5]
266                             with open(FileName, 'r', encoding='utf-8') as f:
267                                 for line in f:
268                                     line = line.strip().split(',')
269                                     if tiaojian_after in line[tiaojian_suoyin]:
270                                         res.append([line[rol_suoyin1],line[rol_suoyin2], line[rol_suoyin3]])
271                             return res
272                         else:
273                             return '条件输入有误'
274                     else:
275                         return '条件输入有误'
276             elif rol_number == 4:
277                 r1, r2, r3, r4 = rol_douhao_list[0], rol_douhao_list[1], rol_douhao_list[2], rol_douhao_list[3]
278                 if r1 == r2 or r1 == r3 or r1 == r4 or r2 == r3 or r2 == r4 or r3 == r4:
279                     return '列名重复'
280                 rol_suoyin1, rol_suoyin2, rol_suoyin3, rol_suoyin4 = rol_name.index(r1), rol_name.index(r2), rol_name.index(r3), rol_name.index(r4)
281                 if '>' in tiaojian:
282                     tiaojian = tiaojian.split('>')
283                     tiaojian_before = tiaojian[0]
284                     tiaojian_after = tiaojian[1]
285                     if tiaojian_before in rol_name and tiaojian_after.isdigit():
286                         tiaojian_suoyin = rol_name.index(tiaojian_before)
287                         with open(FileName, 'r', encoding='utf-8') as f:
288                             for line in f:
289                                 line = line.strip().split(',')
290                                 if int(line[tiaojian_suoyin]) > int(tiaojian_after):
291                                     res.append([line[rol_suoyin1], line[rol_suoyin2], line[rol_suoyin3], line[rol_suoyin4]])
292                         return res
293                     else:
294                         return '条件输入有误'
295                 elif '<' in tiaojian:
296                     tiaojian = tiaojian.split('<')
297                     tiaojian_before = tiaojian[0]
298                     tiaojian_after = tiaojian[1]
299                     if tiaojian_before in rol_name and tiaojian_after.isdigit():
300                         tiaojian_suoyin = rol_name.index(tiaojian_before)
301                         with open(FileName, 'r', encoding='utf-8') as f:
302                             for line in f:
303                                 line = line.strip().split(',')
304                                 if int(line[tiaojian_suoyin]) < int(tiaojian_after):
305                                     res.append([line[rol_suoyin1],line[rol_suoyin2], line[rol_suoyin3], line[rol_suoyin4]])
306                         return res
307                     else:
308                         return '条件输入有误'
309                 elif '=' in tiaojian:
310                     tiaojian = tiaojian.split('=')
311                     tiaojian_before = tiaojian[0]
312                     tiaojian_after = tiaojian[1]
313                     if tiaojian_before in rol_name:
314                         tiaojian_suoyin = rol_name.index(tiaojian_before)
315                         with open(FileName, 'r', encoding='utf-8') as f:
316                             for line in f:
317                                 line = line.strip().split(',')
318                                 if line[tiaojian_suoyin] == tiaojian_after:
319                                     res.append([line[rol_suoyin1],line[rol_suoyin2], line[rol_suoyin3], line[rol_suoyin4]])
320                         return res
321                     else:
322                         return '条件输入有误'
323                 else:
324                     if rec[4] == 'like':
325                         if tiaojian in rol_name:
326                             tiaojian_suoyin = rol_name.index(tiaojian)
327                             tiaojian_after = rec[5]
328                             with open(FileName, 'r', encoding='utf-8') as f:
329                                 for line in f:
330                                     line = line.strip().split(',')
331                                     if tiaojian_after in line[tiaojian_suoyin]:
332                                         res.append([line[rol_suoyin1],line[rol_suoyin2], line[rol_suoyin3], line[rol_suoyin4]])
333                             return res
334                         else:
335                             return '条件输入有误'
336                     else:
337                         return '条件输入有误'
338         elif rol_number == 5:
339             for v in dic.values():
340                 judge_list.append(v)
341             if judge_list == [1, 1, 1, 1, 1]:
342                 return judge(5)
343             else:
344                 return '列名重复'
345         else:
346             return '列名输入有误'
347     else:
348         return '列名输入有误或语法错误'
349 
350 @login
351 def add_operate(rec):
352     '''
353     添加操作函数
354     接收处理后的列表
355     返回存放添加结果和所添加数据的列表
356     '''
357     if rec[1].isdigit() and rec[2].isdigit():
358         with open(FileName, 'a+', encoding='utf-8') as f:
359             f.seek(0)
360             for line in f:
361                 yg_id = str(int(line.strip().split(',')[0])+1)
362             # for line in f:
363             #     yg_id = line.strip().split(',')[0]
364                 # yg_add = yg_id + ',' + ','.join(rec)
365             f.write(f'\n{yg_id},{",".join(rec)}')
366         return f'成功添加数据:{yg_id},{",".join(rec)}'
367     else:
368         return '输入错误'
369 
370 @login
371 def del_operate(rec):
372     '''
373     删除操作函数
374     接收处理后的列表
375     返回存放删除结果和存放所删除结果的列表
376     '''
377     rec = ''.join(rec)
378     yg_dic = {}
379     del_line = []
380     def operate():
381         count = 0
382         re_count = 0
383         with open(FileName, encoding='utf-8') as f1,\
384             open(FileName+'.bak', 'w', encoding='utf-8') as f2:
385             read_lines = f1.readlines()
386             for line in read_lines:
387                 line = line.split(',')
388                 if rec not in line:
389                     if count < len(read_lines)-2:
390                         line = ','.join(line)
391                         f2.write(line)
392                         count += 1
393                         continue
394                     else:
395                         line = ','.join(line).strip()
396                         f2.write(line)
397                         continue
398                 del_line.append(','.join(line).strip())
399                 re_count += 1
400         if re_count == 1:
401             yorn = input(f'删除数据:\n\t{del_line}\n确认删除(Y/N):')
402             if yorn.lower() == 'y':
403                 os.remove(FileName)
404                 os.rename(FileName+'.bak', FileName)
405                 return f'删除数据成功:{del_line}'
406             else:
407                 return f'删除数据操作取消'
408         else:
409             os.remove(FileName+'.bak')
410             l = []
411             for i in range(len(del_line)):
412                 l.append(del_line[i]+'\n')
413             del_line_fail = '\t\t'.join(l).strip()
414             return f'ERROR:输入姓名重复(请尝试使用id删除)\n\t' \
415                    f'重复数据如下:\n\t\t{del_line_fail}'
416     with open(FileName, encoding='utf-8') as f:
417         for line in f:
418             line = line.strip().split(',')
419             yg_dic.setdefault(line[0], line[1])
420     if rec in yg_dic or rec in yg_dic.values():
421         return operate()
422     # elif rec in yg_dic.values():
423     #     return operate()
424     else:
425         return '输入错误'
426 
427 @login
428 def update_operate(rec):
429     '''
430     修改操作函数(仅对唯一对象进行修改)
431     接收处理后的列表
432     返回存放修改结果和所修改对象的列表
433     '''
434     rol_name = ['id', 'name', 'age', 'phone', 'job']
435     if '=' in rec[1]:
436         rol = rec[1].split('=')[0]
437         new_data = rec[1].split('=')[1]
438         tiaojian = rec[3]
439         read_lines_suoyin = 0
440         count = 0
441         if rol in rol_name:
442             rol_suoyin = rol_name.index(rol)
443             with open(FileName, encoding='utf-8') as f:
444                 read_lines = f.readlines()
445             if '=' in tiaojian:
446                 tiaojian_before = tiaojian.split('=')[0]
447                 if tiaojian_before in rol_name:
448                     tiaojian_before_suoyin = rol_name.index(tiaojian_before)
449                     tiaojian_after = tiaojian.split('=')[1]
450                     for i in read_lines:
451                         i = i.split(',')
452                         # print(tiaojian_after, i[tiaojian_before_suoyin],tiaojian_after == i[tiaojian_before_suoyin])
453                         # print(len(read_lines))
454                         # print("i :", i, read_lines[len(read_lines)-1].split(','))
455                         # print(i[tiaojian_before_suoyin] != tiaojian_after)
456                         if i[tiaojian_before_suoyin].strip() == tiaojian_after:
457                             count += 1
458                             i[rol_suoyin] = new_data
459                             updata_data = ','.join(i)
460                             read_lines[read_lines_suoyin] = updata_data
461                             if count > 1:
462                                 return '查询结果不唯一,无法修改'
463                         if i == read_lines[len(read_lines)-1].split(',') and count == 0\
464                                 and i[tiaojian_before_suoyin] != tiaojian_after:
465                             return '条件查询结果为空'
466                         read_lines_suoyin += 1
467                     with open(FileName+'.bak', 'w', encoding='utf-8')as f1:
468                         for i in read_lines:
469                             f1.write(f'{i}')
470                     os.remove(FileName)
471                     os.rename(FileName+'.bak', FileName)
472                     return f'成功修改数据:{updata_data.strip()}'
473                 else:
474                     return '输入有误或语法错误'
475             else:
476                 return '现仅支持条件为等于时的修改'
477         else:
478             return '输入有误或语法错误'
479     else:
480         return '语法错误'
481 
482 def first_operate(rec):
483     '''
484     初步处理函数
485     接收用户输入对象并分割为列表
486     返回将要执行的函数
487     '''
488     rec = rec.split()
489     if len(rec)>= 4 and ("'" in rec[3] or '"' in rec[3]):
490         rec[3] = rec[3].replace("'", "", 2)
491         rec[3] = rec[3].replace('"', '', 2)
492     if rec[0] == 'select' and len(rec) >= 4 and rec[2] == 'where':
493         return select_operate(rec)
494     elif rec[0] == 'set' and len(rec) >= 4 and 'where' in rec:
495         return update_operate(rec)
496     elif len(rec) == 1:
497         return del_operate(rec)
498     elif len(rec) == 4:
499         return add_operate(rec)
500     else:
501         return '输入错误'
502 
503 while 1:
504     if tip:
505         tip = False
506         print('输入help可查看各语句用法')
507     rec = input('>>>')
508     if rec.isspace():
509         print('输入错误')
510     elif rec == '':
511         continue
512     elif rec == 'exit' or rec == 'quit' or rec == '\q':
513         print('退出系统...')
514         break
515     elif rec == 'help' or rec == 'select -h' or rec == 'set -h':
516         if rec == 'help':
517             print('''    1.文件存储格式为:id,name,age,phone,job
518     2.增加:直接按序输入姓名 年龄 手机号 工作即可 以空格间隔
519     3.查询:select 列名1,列名2,... where 列名条件
520     4.删除指定员工,直接输入员工id或名字即可
521     5.修改:set 列名='新的值' where 条件''')
522         elif rec == 'select -h':
523             print('查询:select 列名1,列名2,... where 列名条件')
524         elif rec == 'set -h':
525             print('修改:set 列名="新的值" where 条件')
526     else:
527         res = first_operate(rec)
528         print('结果如下:')
529         if type(res) == list:
530             if '登入成功' in res:
531                 FLAG = True
532                 for i in res:
533                     if type(i) == list:
534                         for j in i:
535                             print(f'\t{j}')
536                     else:
537                         print(f'\t{i}')
538             elif res == []:
539                 print('\t未查询到结果')
540             else:
541                 for i in res:
542                     if type(i) == list:
543                         for j in i:
544                             print(f'\t{j}', end=' ')
545                         print('')
546                     else:
547                         print(f'\t{i}')
548         else:
549             print(f'\t{res}')
代码

以上~
posted @ 2022-02-23 18:22  _泡泡  阅读(367)  评论(0编辑  收藏  举报