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("请输入第一层:"))   # 主程序,开始运行
View Code

 

 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")
View Code
 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 }
View Code

 

posted @ 2017-12-24 15:27  kiko0o0  阅读(245)  评论(0编辑  收藏  举报