原标题:Python入门案例-用户注册和登录
1. 用户注册
1.1. 需求
1. 用户注册的数据包含: 用户名,密码,邮箱
2. 用户名长度为6-14之间并且不能够重复
3. 密码只能是数字和字母
4. Email是合法的并且不能够重复
5. 将符合要求的用户数据保存到文件中(user.xls)
1.2. 代码实现
用户注册.py
1. import os
2. import xlrd
3. import xlwt
4. import re
5.
6. # from xlutils.copy import copy
7.
8. filepath = "./users.xls"
9.
10.
11. def readUsers():
12. """
13. 读取excel中的文件并且将数据以列表的形式返回
14. :return: 列表
15. """
16. # 检查文件是否存在
17. isFile = os.path.isfile(filepath)
18. if not isFile:
19. # 如果文件不存在,返回空的列表.意味着每个用户
20. return []
21.
22. # 如果文件存在然后读取excel中的数据, 将每行数据放在一个字典中, 将所有行数据放在列表中
23. workbook = xlrd.open_workbook(filepath)
24. booksheet = workbook.sheet_by_index(0) # 得到第一个booksheet
25. nrows = booksheet.nrows # 得到里面的数据行数
26.
27. rows = [] # 存放所有数据 将每行数据放在一个字典中, 将所有行数据放在列表中
28. """
29. rows中的数据结构:
30. [{'username': 'admin', 'password': 'admin', 'email': 'admin@itsource.cn'},
31. {'username': 'zhangsan', 'password': 'zhangsan', 'email': 'zhangsan@itsource.cn'}]
32. """
33. titles = ["username", "password", "email"] # 每行数据的键
34. for i in range(0, nrows):
35. # 根据excel中的行数循环出得到每行的数据
36. values = booksheet.row_values(i) # 得到每行数据
37. # 根据上面titles中提供数据的键与值生成一个字典
38. row = dict(zip(titles, values)) # 将每行数据的键值合并生成一个字典
39.
40. # 将excel中的每行数据对应的字典放在rows中保存
41. rows.append(row) # 将每行数据放在rows中
42.
43. return rows
44.
45.
46. def checkUsername(username):
47. # 去除两边空格
48. username = username.strip()
49.
50. # 检查用户名的长度
51. length = len(username)
52. if length < 6 or length > 14:
53. print("用户名长度必须在6-14之间")
54. return False
55.
56. # 检查用户名是否存在
57. rows = readUsers()
58. for row in rows:
59. if row['username'] == username:
60. print("用户名已经被占用,请更换用户名!")
61. return False
62. else:
63. return True
64.
65.
66. def checkPassword(password, repassword):
67. if not password.isalnum():
68. print("密码必须是数字或者字符串!")
69. return False
70.
71. if password.strip() != repassword.strip():
72. print("密码和确认密码必须一致!")
73. return False
74. return True
75.
76.
77. def checkEmail(email):
78. email = email.strip()
79. if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) == None:
80. print("邮箱格式不正确")
81. return False
82.
83. rows = readUsers()
84. for row in rows:
85. if row['email'] == email:
86. print("邮箱已经被占用,请更邮箱!")
87. return False
88.
89. return True
90.
91.
92. def write_excel_data1(row):
93. """
94. 注册成功之后: 读取原Excel中的原来的所有数据, 再将新的数据放到原来的所有数据中.
95. 再将所有数据重新保存到新的Excel中,覆盖原来的Excel
96. :param row:
97. :return:
98. """
99. # 读取老的数据
100. rows = readUsers()
101. # 添加新的数据
102. rows.append(row)
103.
104. # 将所有数据重新写入Excel覆盖原来的Excel
105. workbook = xlwt.Workbook()
106. sheet = workbook.add_sheet("用户信息", cell_overwrite_ok=True)
107. for i in range(0, len(rows)):
108. sheet.write(i, 0, rows[i]["username"])
109. sheet.write(i, 1, rows[i]["password"])
110. sheet.write(i, 2, rows[i]["email"])
111. workbook.save(filepath)
112.
113.
114. if __name__ == "__main__":
115. while True:
116. username = input("请输入用户名:")
117. password = input("请输入密码:")
118. repassword = input("请输入确认密码:")
119. email = input("请输入邮箱:")
120.
121. # 检查用户名
122. result = checkUsername(username)
123. if not result:
124. continue
125.
126. # 检查密码
127. result = checkPassword(password, repassword)
128. if not result:
129. continue
130.
131. # 检查Email
132. result = checkEmail(email)
133. if not result:
134. continue
135.
136. # 全部通过后准备将注册的信息保存到Excel中
137. row = {"username": username, "password": password, "email": email}
138. write_excel_data1(row)
139. print("注册成功")
140. break
1.3. 运行效果:
1. 请输入用户名:zhangsan
2. 请输入密码:zhangsan
3. 请输入确认密码:zhangsan
4. 请输入邮箱:zhangsan@itsource.cn
5. 注册成功
2. 需求二:用户登录
2.1. 需求
1. 基于上一题的用户注册数据进行登陆
2. 如果输入错误三次就把用户名写入到一个文件(erroruser.xls)中. 该文件用来记录非法用户
3. 登陆成功之后将登陆成功的状态记录在status.txt文件中. yes表示登录的状态. no表示没有登陆的状态
- 登陆之后的文件内容:
status.txt中的内容:
yes
- 没有登陆或者登陆退出之后的文件内容:
status.txt中的内容:
no
2.2. 代码实现
用户登录.py
1. from data import readUsers
2. from data import myinput
3. import xlwt
4.
5. # 记录登录次数
6. error_count = 0
7.
8. while 1:
9. username = myinput("请输入用户名:")
10. password = myinput("请输入密码:")
11.
12. # 得到users.xls中的所有数据
13. rows = readUsers()
14.
15. # 用户名和密码与所有数据进行对比
16. for row in rows:
17. if row['username'] == username and row['password'] == password:
18. print("登录成功!")
19. error_count = 0
20.
21. # 记录登录成功的标识
22. with open('./status.txt', 'w') as f:
23. f.write("yes")
24.
25. # 登陆成功之后跳出循环
26. break
27. else:
28. print("登录失败!")
29. # 记录登录成功的标识
30. with open('./status.txt', 'w') as f:
31. f.write("yes")
32.
33. # 登录次数+1
34. error_count += 1
35. if error_count >= 3:
36. workbook = xlwt.Workbook()
37. sheet = workbook.add_sheet("错误用户名")
38. sheet.write(0, 0, username)
39. workbook.save("./erroruser.xls")
data.py:
1. import os
2. import xlrd
3.
4. filepath = "./users.xls"
5.
6.
7. def readUsers():
8. """
9. 读取excel中的文件并且将数据以列表的形式返回
10. :return: 列表
11. """
12. # 检查文件是否存在
13. isFile = os.path.isfile(filepath)
14. if not isFile:
15. # 如果文件不存在,返回空的列表.意味着每个用户
16. return []
17.
18. # 如果文件存在然后读取excel中的数据, 将每行数据放在一个字典中, 将所有行数据放在列表中
19. workbook = xlrd.open_workbook(filepath)
20. booksheet = workbook.sheet_by_index(0) # 得到第一个booksheet
21. nrows = booksheet.nrows # 得到里面的数据行数
22.
23. rows = [] # 存放所有数据 将每行数据放在一个字典中, 将所有行数据放在列表中
24. """
25. rows中的数据结构:
26. [{'username': 'admin', 'password': 'admin', 'email': 'admin@itsource.cn'},
27. {'username': 'zhangsan', 'password': 'zhangsan', 'email': 'zhangsan@itsource.cn'}]
28. """
29. titles = ["username", "password", "email"] # 每行数据的键
30. for i in range(0, nrows):
31. # 根据excel中的行数循环出得到每行的数据
32. values = booksheet.row_values(i) # 得到每行数据
33. # 根据上面titles中提供数据的键与值生成一个字典
34. row = dict(zip(titles, values)) # 将每行数据的键值合并生成一个字典
35.
36. # 将excel中的每行数据对应的字典放在rows中保存
37. rows.append(row) # 将每行数据放在rows中
38.
39. return rows
40.
41.
42. def myinput(prompt=''):
43. """
44. 获取用户输入去除两边空格
45. :param prompt:
46. :return:
47. """
48. return input(prompt).strip()