一,作者介紹
吳海東:My Blog:http://www.cnblogs.com/whd-67270
二,程序說明
1. 查詢員工信息
2. 創建新員工信息
3. 修改員工信息
4. 退出
三,程序前准備
創建一個存放員工信息的文件staff.txt
四,程序腳本
# -*- coding: UTF-8 -* import re import os BASE_DIR = (os.path.dirname(os.path.abspath(__file__))) #print("##%s"%BASE_DIR) def staff_file(filename): """ 讀取員工信息文件 :return: 返回讀取結果 """ with open(filename, 'r', encoding="utf-8") as f: f = list(f) # 將結果轉換成列表 return f # 返回結果 def file_exist_check(file_name): if not os.path.exists(file_name): print("Error: file %s is not exist!!!" % file_name) exit(2) def server_options1(): """ 打印一個服務項 :return:返回用戶輸入的選項 """ for staff_tabe in range(1): print("1.查詢員工信息\n2.增加員工信息\n3.修改員工信息\n4.退出") # 循環打印選項 serial_number = input("請選擇你的服務:") # 獲取用戶輸入的選項 if serial_number.isdigit(): # 判斷是否是數字 serial_number = int(serial_number) # 轉成數字類型 return serial_number # 返回選項結果 else: print("請輸入規范的服務編號") continue def query_function(): """ 員工模糊查詢功能選項 :return: 返回最終的查詢結果 """ file_name = (BASE_DIR+"\staff.txt") # 獲取員工信息文件 file_exist_check(file_name) # 檢查文件是否存在 file = staff_file(file_name) for fm in range(1): print("1.員工年齡\n2.員工職業\n3.員工登記日期") # 循環打印選項 fm_server = input("請選擇你要查詢的服務:") # 獲取用戶輸入的選項 if fm_server.isdigit(): # 判斷是否是數字 fm_server = int(fm_server) # 轉成數字類型 if fm_server <= 3 and fm_server >= 0: # 判斷是否有不規則的選項 if fm_server == 1: staff_age = input("請輸入員工年齡:") # 獲取用戶輸入的年齡數 # 判斷員工信息表里是否有用戶輸入的年齡數 while True: loginSucces = False flag = 0 # 記錄查詢到的信息數 for staff_fm in file: tmp_file = (staff_fm.strip('\n').split(',')) # 如果有這個年齡數的就打印輸出列表 if staff_age in tmp_file[2]: print(tmp_file) flag += 1 else: continue # 遞歸查詢列表 loginSucces = True # 如果查詢到了列表就定義為True if loginSucces == True:print("查詢到%s條您要的員工信息\n"%flag) # 打印輸出查詢到的信息數 if loginSucces == True:break else: # 如果沒有查詢到列表就打印此輸出,並退出查詢 print("\033[31;1m沒有此年齡段的用戶!\033[0m\n") break elif fm_server == 2: staff_work = input("請輸入員工職業:") # 獲取用戶輸入的職業名 # 判斷員工信息表里是否有用戶輸入的職業名 while True: loginSucces = False flag = 0 # 記錄查詢到的信息數 for staff_fm in file: tmp_file = (staff_fm.strip('\n').split(',')) if staff_work in tmp_file[4]: # 如果有這個職業名的就打印輸出列表 print(tmp_file) flag += 1 else: continue # 遞歸查詢列表 loginSucces = True # 如果查詢到了列表就定義為True if loginSucces == True:print("查詢到%s條您要的員工信息\n"%flag) # 打印輸出查詢到的信息數 if loginSucces == True:break else: # 如果沒有查詢到列表就打印此輸出,並退出查詢 print("\033[31;1m沒有此職業的用戶!\033[0m\n") break elif fm_server == 3: staff_Date_Fegistration = input("請輸入員工登記日:") # 獲取用戶輸入的登記日 # 判斷員工信息表里是否有用戶輸入的登記日 while True: loginSucces = False flag = 0 # 記錄查詢到的信息數 for staff_fm in file: tmp_file = str(staff_fm.strip('\n').split(',')) # 如果有這個登記日,並且符合規范的就打印輸出列表,例如2018-03-14 if staff_Date_Fegistration in tmp_file[5]: filter_files = re.search( '(.*\d+-\d+-\d+).*', tmp_file) print(filter_files.group()) flag += 1 else: continue # 遞歸查詢列表 loginSucces = True # 如果查詢到了列表就定義為True if loginSucces == True:print("查詢到%s條您要的員工信息\n"%flag) # 打印輸出查詢到的信息數 if loginSucces == True:break else: # 如果沒有查詢到列表就打印此輸出,並退出查詢 print("\033[31;1m沒有此登記日的用戶!\033[0m\n") break def list_number(file_name): """ 獲取文件的總行數 :return: 返回一個總行數 """ with open(file_name, 'r', encoding="utf-8") as f: text = f.read() length = len(text.splitlines()) return length def add_function(): """ 創建一條新的員工數據項,把新的數據項寫入原文件 :return: """ file_name = (BASE_DIR + "\staff.txt") # 獲取員工信息文件 file_exist_check(file_name) # 檢查文件是否存在 while True: flag = list_number(file_name) # 獲取員工信息列表的總行數 try: staff_name, staff_age, staff_phone, staff_work, staff_date = input( '請輸入新員工詳細信息:').strip().split() # 獲取用戶輸入的各項新員工詳細信息 except ValueError: print('信息不符合規范!請規范填寫以空格隔開,例如:姓名 年齡 電話號碼 職業 入職日期') else: staff_phone = str(staff_phone) # 用戶輸入的新員工電話號要做特殊處理 if re.search('(\d{11})', staff_phone): # 判斷是否是11位的電話號 file_tmp = staff_file(file_name) # 讀取員工信息列表 for staff_fm in file_tmp: staff_number = staff_fm.strip('\n').split(',') staff_number = staff_number[3] # 截取列表每行的電話號碼 if staff_phone in staff_number: # 判斷用戶輸入的新員工電話號是否有在列表里 print('%s\n這個號碼已經存在!' % staff_number) else: continue # 遞歸查詢列表 else: # 判斷用戶輸入的除電話號意外的所有信息數據類型是否符合規范 if staff_name.isalpha() and staff_age.isdigit() and staff_work.isalpha()\ and re.search('(\d{4}-\d{2}-\d{2})', staff_date): with open('staff.txt', 'a+', encoding='utf-8') as f_c: flag += 1 # 行數自加 # 把規范的新員工信息寫入員工信息表 f_c.write( "\n%s,%s,%s,%s,%s,%s" % (flag, staff_name, staff_age, staff_phone, staff_work, staff_date)) print('添加成功') break else: # 如果有不符合規范的數據類型就打印此輸出 print('輸入的信息有不規范的類型,請重新輸入!') continue #重新輸入新員工信息 else: # 如果有不符合規范的電話號就打印此輸出 print('請輸入規范的11位數的電話號碼!') def file_tmp1(file_tmp): """ :param file_tmp: :return: """ for line_tmp in file_tmp: line_tmp = line_tmp.strip('\n').split(',') print(line_tmp) return file_tmp def update_function(): file_name = (BASE_DIR + "\staff.txt") # 獲取員工信息文件 file_exist_check(file_name) # 檢查文件是否存在 while True: flag = list_number(file_name) # 獲取員工信息文件的行數 file_tmp1(staff_file(file_name)) # 循環打印出整個員工信息列表 staff_id = input('請輸入要修改的員工ID號:').strip() # 獲取用戶輸入的員工ID號 if re.match('\d', str(staff_id)): # 判斷用戶輸入的ID號是否是數據類型 # 判斷用戶輸入的ID號數是否等於列表的行數並且不等於0 if int(staff_id) == int(flag) and int(staff_id) > 0: with open('staff.txt', 'r', encoding='utf-8')as f: lines = f.readlines() # 讀取整個員工信息列表 with open('staff.txt', 'w', encoding='utf-8')as f_up: # 寫入員工列表 for line in lines: # 循環已逗號分割員工列表 single_list = line.strip('\n').split(',') # 判斷用戶輸入的ID號是否有在員工列表里,有就打印出這個列表 if str(staff_id) in single_list: print(single_list) # 獲取用戶要修改這個列表的具體數據項 staff_info = input('請輸入要修改的員工信息:').strip() # 獲取用戶輸入的新數據項 new_staff_info = input('請輸入要修改的新員工信息:').strip() # 判斷用戶輸入的要修改項是否在這個列表里 if staff_info in single_list: # 如果有這個選項就把舊的數據替換成新的數據 single_list[single_list.index(staff_info)] = new_staff_info # 把這個列表以逗號重新責成一個新列表 new_single_list = ','.join(single_list) # 把之前匹配到的列表替換成新的列表 line = line.replace(line, new_single_list) else: print("沒有此信息的用戶") # 如果用戶輸入的ID不在這個員工列表里,把這個列表直接寫入文件 f_up.write("%s\n" % line.strip()) break else: print("沒有這個員工ID號!") else: print("請輸入規范的員工ID號") while True: serial_number = server_options1() if serial_number <= 4 and serial_number >= 0: if serial_number == 1: # 選項1進入查詢員工服務 query_function() elif serial_number == 2: # 選項2進入創建員工服務 add_function() elif serial_number == 3: # 選項3進入修改員工服務 update_function() elif serial_number == 4: # 退出員工管理系統 exit("謝謝使用,再見!") else: print("請輸入規范的服務編號!\n") continue