day1作业
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author: Even 4 5 6 count = 0 # 为了记录需求中3次输入错误避免的次数,计数项赋初始值 7 load = True # 为了完成功能后退出,赋初始值 8 file = open("正确用户信息文件",'r',encoding='utf-8') # 打开正确用户信息文档,获取正确的用户名密码 9 file_wrong = open("锁定用户信息文件",'r+',encoding='utf-8') # 打开已锁定的用户信息文档,获取锁定的用户名密码 10 line = eval(file.readline()) # 将正确信息中的字符串转换成字典(原字符串为字典格式) 11 line_wrong = eval(file_wrong.readline()) # 将正确信息中的字符串转换成列表(原字符串为列表格式) 12 13 14 def out(): # 将重复代码定义,功能是帮助跳出while循环并关闭已打开文档 15 global load # 声明全局变量 16 load = False # 赋值load,为了跳出while循环 17 file_wrong.close() # 关闭正确用户信息文档 18 file.close() # 关闭锁定用户信息文档 19 20 while load: # 判断是否已完成功能 21 name = input("请输入用户名:") # 输入用户名 22 password = input("请输入密码:") # 输入密码 23 if name in line and name not in line_wrong: # 判断用户名是否正确,和是否已被锁定 24 while count <= 3: # 判断是否已循环3次 25 if password == line[name]: # 判断用户名是否对应正确的密码 26 print("您已成功登陆") # 输出成功登陆信息 27 out() # 调用自定义out方法 28 break # 跳出本次循环 29 else: # 说明未输入正确的密码 30 count +=1 # 计数项自加一 31 msg_count = '''第%s次密码输入错误\n'''%(count) # 提示输入错误次数 32 print(msg_count) # 打印错误次数信息 33 if count < 3: # 小于三次错误输入,可以重新输入 34 password = input("密码错误,请重新输入密码:") # 重新输入密码 35 elif count == 3: # 判断是否已输错三次 36 print("已输错3次,账号已锁定") # 打印锁定提示信息 37 line_wrong.append(name) # 将已锁定信息加入锁定元组中 38 file_wrong.seek(0) # 输入指针移到开头,如果不移动会产生多个元组 39 file_wrong.write(str(line_wrong)) # 写入锁定信息 40 file_wrong.tell() # 获取当前的输入指针位置,如果不获取会产生多个元组 41 out() # 调用out方法 42 break 43 elif name in line_wrong: # 判断用户名是否在已锁定用户名中 44 print("该用户名已被锁定") # 打印已锁定通知信息 45 out() # 调用自定义out方法 46 break # 跳出当前循环 47 else: # 说明用户名不在正确用户名信息中 48 print("该用户名不存在") # 打印用户名输入错误信息 49 out() # 调用out方法
1 file = open("fdfdsf",'r+',encoding='utf-8') # 打开正确用户信息文档,获取正确的用户名密码 2 line = eval(file.readline()) # 将正确信息中的字符串转换成字典(原字符串为字典格式) 3 line.append(name) # 将已锁定信息加入锁定元组中 4 file.seek(0) # 输入指针移到开头,如果不移动会产生多个元组 5 file.write(str(line)) # 写入信息 6 file.tell() # 获取当前的输入指针位置,如果不获取会产生多个元组 7 file.close() # 关闭正确用户信息文档
模拟登陆作业需求:
1. 用户输入帐号密码进行登陆
2. 用户信息保存在文件内
3. 用户密码输入错误三次后锁定用户
额外实现功能:
1.提示输入错误次数
2.输入已锁定用户会提示
3.用户不存在会提示
正确用户信息文件中以字典形式保存用户名密码:
{'name': 'password','cx':'123','even':'456','test':'ok'}
锁定用户信息文件中以列表形式保存锁定用户名:
['name']
第二种方法:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:kiko0o0 4 5 import os 6 import sys 7 import getpass 8 LOCAL_DIR = os.path.dirname(os.path.abspath(__file__)) 9 USER_DB = "%s/%s" % (LOCAL_DIR, "UserInfo.db") 10 PLANTFORM = sys.platform 11 12 # 初始化用户[当用户文件不存在时生效] 13 if os.path.exists(USER_DB): 14 pass 15 else: 16 UserInfo = "admin 123456 0\nuser01 123456 0\ntotal 0 0\n" 17 18 # 编辑文件的一种方式,优于open,文件句柄当不用时自动关闭 19 with open(USER_DB, "w") as write_file: 20 write_file.write(UserInfo) 21 22 # 将用户信息生成一个字典,方便操作 23 user_info = dict() 24 with open(USER_DB, "r") as read_file: 25 for line in read_file: 26 if len(line) != 0: 27 username, password, times = line.split() 28 if username == "total": 29 user_info[username] = {"times": int(times), "flag": password} # flag无实际意义 30 else: 31 user_info[username] = {"password": password, "times": int(times)} 32 33 34 def up(): 35 global UserInfo 36 UserInfo = "" 37 # 字符串拼接用户信息 38 for info in user_info.keys(): 39 if info == "total": 40 userInfo = "%s %s %s \n" % (info, 0, user_info["total"]["times"]) 41 else: 42 userInfo = "%s %s %s \n" % (info, user_info[info]["password"], user_info[info]["times"]) 43 UserInfo = "%s%s" % (UserInfo, userInfo) 44 with open(USER_DB, "w") as write_file: 45 write_file.write(UserInfo) 46 # 主逻辑区 47 while user_info["total"]["times"] < 3: 48 print("IT 技术管理后台") 49 username = input("input your username\n:>>>").strip() 50 if PLANTFORM == "linux2": 51 password = getpass.getpass("input your password\n:>>>").strip() 52 elif PLANTFORM == "linux": 53 password = getpass.getpass("input your password\n:>>>").strip() 54 else: 55 password = input("input your password\n:>>>").strip() 56 if username in user_info: 57 if user_info[username]["times"] == 3: 58 exit("account is lock, Contact the administrator") 59 elif password == user_info[username]["password"]: 60 print("Good morning %s" % username) 61 user_info[username]["times"] = 0 62 user_info["total"]["times"] = 0 63 up() 64 break 65 else: 66 input("Enter to wrong account password. (Any key to continue)") 67 user_info[username]["times"] += 1 68 user_info["total"]["times"] += 1 69 up() 70 71 else: 72 input("Enter to wrong account password. (Any key to continue)") 73 user_info["total"]["times"] += 1 74 up() 75 76 else: 77 user_info["total"]["times"] = 0 78 up() 79 input("Too many retries, please try again later. (Any key to continue)") 80 exit("88") 81 82 print(''' 83 initializing........ 84 \033[5m//////////////////////////////////////////////////////////////////// 85 // _ooOoo_ // 86 // o8888888o // 87 // 88" . "88 // 88 // (| -_- |) // 89 // O\ = /O // 90 // ____/`---'\____ // 91 // .' \\| |// `. // 92 // / \\||| : |||// \ // 93 // / _||||| -:- |||||- \ // 94 // | | \\\ - /// | | // 95 // | \_| ''\---/'' | | // 96 // \ .-\__ `-` ___/-. / // 97 // ___`. .' /--.--\ `. . ___ // 98 // ."" '< `.___\_<|>_/___.' >'"". // 99 // | | : `- \`.;`\ _ /`;.`/ - ` : | | // 100 // \ \ `-. \_ __\ /__ _/ .-` / / // 101 // ========`-.____`-.___\_____/___.-`____.-'======== // 102 // `=---=' // 103 // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // 104 //////////////////////////////////////////////////////////////////// 105 \033[0m''') 106 input("(Any key to continue)")
===================================================================
1. 运行程序输出第一级菜单
2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单
3. 菜单数据保存在文件中
4. 让用户选择是否要退出
5. 有返回上一级菜单的功能
{
'上海':{
"徐汇区":{
"漕河泾":["zk","test"],
"桂林路":["syf","test"]
},
"松江区":{
"九亭":["zz","mm"],
"泗泾":{"sss","ddd"},
"佘山":{"Aaat","aaa"},
},
"浦东区":{},
},
'陕西':{
"西安":{},
"咸鱼":{},
"兴平":{}
},
'北京':{
"1环":{},
"2环":{},
"3环":{},
},
}
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:kiko0o0 4 5 6 import sys 7 8 file = open("菜单列表",'r',encoding='utf-8') # 打开菜单 9 f = file.read() 10 for line in f: # 读取文件中每行信息 11 file_str = str(f) # 将每行信息转成字符串格式 12 data = eval(file_str) # 字符串转成字典格式 13 14 15 def list(): # 定义读取字典中的key 16 for i in data: 17 print(i) 18 19 20 def choose1(choice1): # 定义第一层选择 21 while choice1 != 'q': # 输入为q即退出程序 22 global one 23 one = choice1 # 定义全局变量one 使得其他函数可以调用 24 if choice1 in data: 25 for i2 in data[one]: 26 print("\t", i2) # 展示3级菜单中所选第一层下的第二层信息 27 choose2(input("请输入第二层:")) # 调用choose2函数,输入第二层信息 28 break 29 elif choice1 == 'b': # 输入b退出循环 30 break 31 else: 32 error = input("输入错误,请重新输入第一层:") # 输入内容不在第一层选项中 33 if error == 'q': # 输入q退出程序 34 sys.exit() 35 else: # 否则调用本函数 36 choose1(error) 37 else: 38 sys.exit() 39 40 41 def choose2(choice2): # 定义第二层选择 42 while choice2 != 'q': 43 global two 44 two = choice2 # 定义全局变量two 使得其他函数可以调用 45 if choice2 in data[one]: 46 for i3 in data[one][two]: 47 print("\t\t", i3) # 展示3级菜单中所选第二层下的第三层信息 48 choose3(input("请输入第三层:")) # 调用choose3函数,输入第三层信息 49 break 50 elif choice2 == 'b': # 输入b退回第一层 51 list() # 调用list函数展示第一层信息 52 choose1(input("请输入第一层:")) 53 break 54 else: 55 error2 = input("输入错误,请重新输入第二层:") # 输入错误,重新输入 56 if error2 == 'q': # 输入q退出程序 57 sys.exit() 58 else: 59 choose2(error2) # 调用本函数 60 else: 61 sys.exit() 62 63 64 def choose3(choice3): # 定义第三层选择 65 while choice3 != 'q': 66 global three 67 three = choice3 # 定义全局变量three 使得其他函数可以调用 68 if choice3 in data[one][two]: 69 for i4 in data[one][two][three]: 70 print("\t\t\t", i4) # 展示3级菜单中所选第三层下的第四层信息 71 choose4(input("最后一层,退回上一层请按‘b’,退出请按'q")) # 调用choose4函数,提示退出或退回 72 break 73 elif choice3 == 'b': # 输入为b退出 74 choose1(one) 75 break 76 else: 77 error3 = input("输入错误,请重新输入第三层:") # 输入错误,可以重新输入,q退出 78 if error3 == 'q': 79 sys.exit() 80 else: 81 choose3(error3) # 调用本函数 82 else: 83 sys.exit() 84 85 86 def choose4(choice4): # 定义最后退出 87 while choice4 != 'q': # 输入q退出 88 if choice4 == 'b': # 输入b退回上一层 89 choose2(two) 90 else: 91 choose4(input("真的是最后一层了,退回上一层请按‘b’,退出请按'q'")) # 声明结束 92 else: 93 sys.exit() 94 95 96 print("退出请按'q',返回上级菜单请按'b'") # 声明功能 97 list() # 调用list函数展示第一层信息 98 choose1(input("请输入第一层:")) # 主程序,开始运行
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:kiko0o0 4 5 import sys 6 7 file = open("菜单列表",'r',encoding='utf-8') 8 f = file.read() 9 #f = file.readline() 10 for line in f: 11 file_str = str(f) 12 data = eval(file_str) 13 14 def list(): 15 for i in data: 16 print(i) 17 18 def choose1(key1): # 定义第一层选择 19 while key1 != 'q': 20 global one 21 one = key1 22 if key1 in data: 23 for i2 in data[one]: 24 print('\t',i2) 25 choose2(input('请输入二级:')) 26 break 27 elif key1 =='b': 28 list() 29 break 30 else: 31 error = input("输入错误,重新输入:") 32 choose1(error) 33 else: 34 sys.exit() 35 36 def choose2(key2): 37 while key2 != 'q': 38 global two 39 two = key2 40 if two in data[one]: 41 for i3 in data[one][two]: 42 print('\t\t',i3) 43 choose3(input('请输入三级菜单:')) 44 break 45 elif two =='b': 46 list() 47 choose1(input('请输入一级菜单:')) 48 break 49 else: 50 error2 = input('输入错误,请重新输入:') 51 choose2(error2) 52 else: 53 sys.exit() 54 55 def choose3(key3): 56 while key3 !='q': 57 global three 58 three = key3 59 if key3 in data[one][two]: 60 for i4 in data[one][two][three]: 61 print('\t\t\t',i4) 62 choose4(input('最后一层,退回"b",退出"q"')) 63 break 64 elif key3 =='b': 65 choose1(one) 66 break 67 else: 68 error3 = input("输入错误,请重新输入:") 69 choose3(error3) 70 else: 71 sys.exit() 72 73 def choose4(key4): 74 while key4 != 'q': 75 if key4 =='b': 76 choose2(two) 77 else: 78 choose4(input('最后一层,退回"b",退出"q"')) 79 else: 80 sys.exit() 81 82 83 print("退出请按'q',返回上级菜单请按'b'") 84 list() 85 choose1(input('请输入城市:'))
----
第二种:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:kiko0o0 4 5 import json 6 7 # 读取菜单列表 8 with open ("menu_file.db", "r", encoding="utf-8") as read_menu: 9 MENU_LIST = read_menu.read() 10 11 # ["EVAL", "JSON"] 功能转换开关 12 CHANGE_FORMAT = "JSON" 13 14 # 转换成字典的方式二种 15 if CHANGE_FORMAT == "EVAL": 16 MENU_LIST = eval(MENU_LIST) 17 else: 18 # json时需要注意:文件中不能包含单引号,严格按照列表字典的书写方式 19 # 不能序列化的示例 {"key1": ["v1","v2",]} {'key1': ["v1","v2"]} 20 MENU_LIST = json.loads(MENU_LIST.replace("'", "\"").replace(" ","").replace("\n","")) 21 22 23 # 临时菜单存放菜单(简单的栈实现,后进先出) 24 TEMP_MENU = [] 25 EXIT_FLAG = True 26 TEMP_MENU.append(MENU_LIST) 27 28 while EXIT_FLAG: 29 temp_menu_list_id = [] 30 temp_menu_list_name = [] 31 if type(TEMP_MENU[-1]) == dict: 32 # 加上sorted排序,会让你的key不会随意的改变顺序,因为字典是无序的 33 for layer1 in enumerate(sorted(TEMP_MENU[-1])): 34 l_id, l_name = layer1[0], layer1[1] 35 temp_menu_list_id.append(l_id) 36 temp_menu_list_name.append(l_name) 37 print(l_id, l_name) 38 temp_menu = dict(zip(temp_menu_list_id, temp_menu_list_name)) 39 real_name = input("input you want to layer[ID or NAME](B:back Q:exit):\n>>>").strip() 40 if real_name == "b" or real_name == "B": 41 if len(TEMP_MENU) > 1: 42 del TEMP_MENU[-1] 43 continue 44 else: 45 input("Now, It's top layer(any key continue)") 46 continue 47 elif real_name == "q" or real_name == "Q": 48 EXIT_FLAG = False 49 continue 50 elif real_name.isdigit(): 51 real_name = int(real_name) 52 if real_name in temp_menu: 53 real_name = temp_menu[real_name] 54 TEMP_MENU.append(TEMP_MENU[-1][real_name]) 55 else: 56 input("The worng ID was entered(any key continue)") 57 continue 58 elif real_name in temp_menu_list_name: 59 TEMP_MENU.append(TEMP_MENU[-1][real_name]) 60 else: 61 input("The worng info was entered(any key continue)") 62 continue 63 else: 64 # 加上sorted排序,会让你的key不会随意的改变顺序,因为字典是无序的 65 for layer1 in enumerate(sorted(TEMP_MENU[-1])): 66 l_id, l_name = layer1[0], layer1[1] 67 temp_menu_list_id.append(l_id) 68 temp_menu_list_name.append(l_name) 69 print(l_id, l_name) 70 temp_menu = dict(zip(temp_menu_list_id, temp_menu_list_name)) 71 real_name = input("Show all menu (B:back Q:exit):\n>>>").strip() 72 if real_name == "b" or real_name == "B": 73 if len(TEMP_MENU) > 1: 74 del TEMP_MENU[-1] 75 continue 76 else: 77 input("Now, It's top layer(any key continue)") 78 continue 79 elif real_name == "q" or real_name == "Q": 80 EXIT_FLAG = False 81 continue 82 else: 83 input("The worng info was entered(any key continue)") 84 continue 85 else: 86 print("88")
1 { 2 '浙江':{ 3 '杭州':{ 4 '西湖': [ 5 '西湖1', 6 '西湖2' 7 ], 8 '江干': [ 9 '江干1', 10 '江干2' 11 ], 12 '下城': [ 13 '下城1', 14 '下城2' 15 ], 16 '上城': [ 17 '上城1', 18 '上城2' 19 ], 20 '滨江': [ 21 '滨江1', 22 '滨江2' 23 ] 24 }, 25 '宁波': [ 26 '海曙', 27 '江东', 28 '江北', 29 '镇海', 30 '余姚' 31 ] 32 }, 33 '江苏': { 34 '苏州': [ 35 '沧浪', 36 '相城', 37 '平江', 38 '吴中', 39 '昆山' 40 ], 41 '南京': [ 42 '白下', 43 '秦淮', 44 '浦口', 45 '栖霞', 46 '江宁' 47 ] 48 }, 49 '广东': { 50 '深圳': [ 51 '罗湖', 52 '福田', 53 '南山', 54 '宝安', 55 '布吉' 56 ], 57 '广州': [ 58 '天河', 59 '珠海', 60 '越秀', 61 '白云', 62 '黄埔' 63 ] 64 } 65 }