python-编写登录入口
主题:用python编写一个登录入口
要求:
- 输入账户密码
- 登录成功显示欢迎信息
- 输错三次密码锁定账户
分析:
- 首先需要一个文件保存用户信息,包括用户名,密码以及该账户是否被锁定
- 其次需要根据用户输入的用户名能够方便地查询文件中是否存在该用户,如果存在,该用户是否被锁定,以及如何判断密码是否匹配。
- 最后输错三次密码,需要将该用户锁定,锁定信息需要保存到原文件中。
参考
https://www.cnblogs.com/elleblog/p/7747554.html
自己实现
- 知识点:
- python对excel文件的读写问题;
- xlrd和xlutils模块只能处理.xls类文件,openpyxl模块只能处理.xlsx类文件;
- 字典--一个关键字可以对应多个值
- 思路
- 创建一个excel表格(后缀是.xlsx,所以本次所用模块为openpyxl),先存入部分用户信息如下:
值得注意的是,.xlsx文件的行列都是从1开始的,.xls文件则是从0开始 - 加载该文件,为用户信息建立字典。其中用户名为关键字,对应的值包括该用户的密码、是否被锁定(1是0否)以及该用户所在行(这里是为了方便后续修改锁定状态)
- 用户输入账户名
- 检查字典是否存在该关键字,不存在,提示错误信息
- 存在,则检查该用户的锁定状态,若锁定,提示
- 未锁定,则提示输入密码
- 检查密码是否匹配
- 正确,则提示登录成功
- 错误次数达到三次后将该用户被锁定的信息写入源文件并保存
- 详细步骤:
————建立文件存储用户信息—————
路径:D:\BJpython\lianXi\logintest\UserInfo\UserInfo.xlsx
内容:
————配置环境和第三方包—————
工具:pycharm
解释器:python3.7
包:openpyxl
————代码部分—————
点击查看代码
# 导入模块
import openpyxl
点击查看代码
# 加载用户信息
user_info_table = openpyxl.load_workbook(r"D:\BJpython\lianXi\logintest\UserInfo\UserInfo.xlsx") # 路径前的r是为了避免转义字符带来的不便,这样可以按照原字符串寻找目标文件
data = user_info_table.worksheets[0]
点击查看代码
# 建立字典,将上面获取到的用户信息按用户名建立字典,每个用户名为一个关键字,其对应的值包括:密码、是否被锁定(1表示锁定)、所在行
user_info = {}
for i in range(2, data.max_row+1):
for j in range(2, data.max_column+1):
user_info.setdefault(data.cell(i, 1).value, []).append(data.cell(i, j).value)
user_info.setdefault(data.cell(i, 1).value, []).append(i)
# 输出观察一下字典建立得是否正确
# print(user_info)
点击查看代码
# 用户输入用户名
user_name = input("please input your username:")
点击查看代码
# 判断用户名是否为空或者错误或者该用户是否已经被锁定,用户名正确且没有被锁定则开始输入密码
if user_name == "":
user_name = input("please input correct username:\n")
if user_name not in user_info.keys():
print("your username is not correct!")
return
if user_info[user_name][1] == "1":
print("Your login name is locked, please contact the service.")
else:
for wrong_time in range(0, 3):
password = input("please input your password:")
if password == str(user_info[user_name][0]): #为了保持等号两边格式相同,所以强制将密码格式改为str
print('Login successfully!')
return
elif wrong_time == 2: # 密码输入错误达到三次则账户被锁定
data.cell(user_info[user_name][2], 3, "1")
user_info_table.save(r"D:\BJpython\lianXi\logintest\UserInfo\UserInfo.xlsx")
# 提示登录名被锁定
print("Input wrong password 3 times, your login name is locked, please contact the service.")
return
原始代码(包含.xls文件的处理方式)
点击查看代码
# -*- coding:utf-8 -*-
# 本代码功能:编写登录入口
# 1.输入用户名密码
# 2.认证成功后显示欢迎信息
# 3. 输错三次后锁定
# 作者:lm
# 日期:2022年1月16日
# 涉及知识点:excel表格-读(xlrd)、写(xlwt,xlutils)以及字典建立和添加关键字-值,和访问等
# 但是创建的excel文件是.xlsx文件,而xlrd和xlwt模块只能操作.xls文件,.xlsx文件需要用openpyxl模块
# import xlrd # xlrd用于读出预先存在excel中的用户信息
# import xlwt
# from xlutils.copy import copy # xlutils.copy用于过渡到xlwt得写功能,即在excel表格中写入内容
import openpyxl
def Login():
# 获取用户信息,表格里包括用户名,密码和是否被锁定的信息
# user_info_table = xlrd.open_workbook(r"D:\BJpython\lianXi\logintest\UserInfo\UserInfo.xlsx", formatting_info=True)
# data = user_info_table.sheets()[0]
user_info_table = openpyxl.load_workbook(r"D:\BJpython\lianXi\logintest\UserInfo\UserInfo.xlsx")
data = user_info_table.worksheets[0]
# 建立字典,将上面获取到的用户信息按用户名建立字典,每个用户名为一个关键字,其对应的值包括:密码、是否被锁定(1表示锁定)、所在行
user_info = {}
# for i in range(1,data.nrows):
# for j in range(1, data.ncols):
# user_info.setdefault(data.cell(i,0).value, []).append(data.cell(i, j).value)
# user_info.setdefault(data.cell(i,0).value, []).append(i)
for i in range(2, data.max_row+1):
for j in range(2, data.max_column+1):
user_info.setdefault(data.cell(i, 1).value, []).append(data.cell(i, j).value)
user_info.setdefault(data.cell(i, 1).value, []).append(i)
# 输出观察一下字典建立得是否正确
# print(user_info)
# 用户输入用户名
user_name = input("please input your username:")
# 判断用户名是否为空或者错误或者该用户是否已经被锁定,用户名正确且没有被锁定则开始输入密码
if user_name == "":
user_name = input("please input correct username:\n")
if user_name not in user_info.keys():
print("your username is not correct!")
return
if user_info[user_name][1] == "1":
print("Your login name is locked, please contact the service.")
else:
for wrong_time in range(0, 3):
password = input("please input your password:")
if password == str(user_info[user_name][0]): #为了保持等号两边格式相同,所以强制将密码格式改为str
print('Login successfully!')
return
elif wrong_time == 2: # 密码输入错误达到三次则账户被锁定
# new_user_info_table = copy(user_info_table)
# new_user_info = new_user_info_table.get_sheets(0)
# new_user_info.write(user_info[user_name][2], 2, "1")
# new_user_info_table.save(r"D:\BJpython\lianXi\logintest\UserInfo\UserInfo.xlsx")
data.cell(user_info[user_name][2], 3, "1")
user_info_table.save(r"D:\BJpython\lianXi\logintest\UserInfo\UserInfo.xlsx")
# 提示登录名被锁定
print("Input wrong password 3 times, your login name is locked, please contact the service.")
return
if __name__ == "__main__":
Login()
其他参考:
python之xlutils的Copy模块
https://www.cnblogs.com/hls-code/p/14839840.html
openpyxl模块
https://www.cnblogs.com/tonyxiao/p/14672521.html
20220116我快想死我男朋友lzy了,他被封在宿舍一个多月了,还不知能不能回家过年,心疼~
何以解忧,唯有学习。