背景
基于函数实现用户认证,要求:
-
写函数,读取的用户信息并构造为字典(用户信息存放在
files/user.xlsx
文件中)6# 方法1,比较麻烦, import openpyxl def get_user_dict(): list = [] name_list = [] pwd_list = [] user = openpyxl.load_workbook("files/user.xlsx") sheet = user.get_sheet_by_name('Sheet1')#通过sheet的name去找到sheet for i in range(2,5):# 手工去选取了内容范围 for j in range(2,4): list.append(sheet.cell(row=i,column=j).value)# 范围内的内容加入到list for i in range(0,len(list)):#分类,分成两个list if i%2 == 0: name_list.append(list[i]) else: pwd_list.append(list[i]) user_dict = dict(zip(name_list,pwd_list))# 两个list合并为一个dict return user_dict print(get_user_dict())
这个方法,采用get_sheet_by_name的方法是参考的:Python Excel,Openpyxl Tutorial
思路是:
- 获取全部信息list
- 将信息分成key和value两个list
- 两个list用zip和dict来合并
# 方法2,教程的解法 import openpyxl def get_user_dict(): user_dict = {} wb = openpyxl.load_workbook("files/user.xlsx") #打开已经存在的文件 sheet = wb.worksheets[0] #通过index去找到sheet for row in sheet.rows: # 直接读row user_dict[row[1].value] = row[2].value return user_dict print(get_user_dict())
这个方法是教程提供的解法,也是采用的openpyxl这个库
最后和我的数据比起来,多取了一个tittle,但代码上明显要简洁很多。
-
用户输入用户名和密码,进行校验。(且密码都是密文,所以,需要将用户输入的密码进行加密,然后再与Excel中的密文密码进行比较)
-
这个基本就等同于是登录的验证。
import openpyxl import hashlib def get_user_dict(): user_dict = {} wb = openpyxl.load_workbook("files/user.xlsx") sheet = wb.worksheets[0] for row in sheet.rows: user_dict[row[1].value] = row[2].value return user_dict def encrypt(origin): #这部分是直教程提供的,接拿过来用,没有自己查写 origin_bytes = origin.encode('utf-8') md5_object = hashlib.md5() md5_object.update(origin_bytes) return md5_object.hexdigest() if __name__ == '__main__': print("please enter the username") username = input("username:") pwd = input("password:") md5_pwd = encrypt(pwd) user_dict = get_user_dict() if username in user_dict: #这里按道理可以做一个无限循环,正确才能录入 if user_dict[username] == md5_pwd: #密码正确 print("login success") else: print("pwd error") # 密码错误 else: print("user no exited") #用户不存在的话提示用户不存在
-
-
用户注册,把信息存进已经存在excel里,也就是追加。必须是密文存进去。
-
openpyxl基本上到cell这个粒度,就可以赋值value了
-
一个难点是怎么追加到当前excel的最后一行,在python里用openpyxl获取到xlsx的当前行数和列数
import openpyxl import hashlib def get_user_dict(): user_dict = {} wb = openpyxl.load_workbook("files/user.xlsx") sheet = wb.worksheets[0] for row in sheet.rows: user_dict[row[1].value] = row[2].value return user_dict def encrypt(origin): origin_bytes = origin.encode('utf-8') md5_object = hashlib.md5() md5_object.update(origin_bytes) return md5_object.hexdigest() def save_new_user(name,pwd): #这里是保存的函数 wb = openpyxl.load_workbook("files/user.xlsx") sheet = wb.worksheets[0] line = str(sheet.max_row+1) # 获取到最新的行数,+1.表明是这次操作的目标 sheet['B'+line] = name #这里只接受字符串,因此是拼接的 sheet['C'+line] = pwd wb.save("files/user.xlsx") # 这个是保存文件的操作 if __name__ == '__main__': user_dict = get_user_dict() print("please enter the username") while True: # 加这个是让一直输入正确才进行下去。 username = input("username:") if username in user_dict: # 如果输入的用户名字已经存在 print("The user name already exists,please re-enter") else: break while True: pwd1 = input("password 1 times:") pwd2 = input("password 2 times:") if pwd1 == pwd2: #两次密码要相等才能存 md5_pwd = encrypt(pwd2) break else: print("The two passwords are different. Please re-enter them") save_new_user(username,md5_pwd)
-
扩展
其实搜关键字出来的都是pandas这个库,看了一眼,还是比较复杂。
没看文档之前,以为是个比较高级字典、list之类的。总之for应该能解决吧?结果print暴力看了几层的type,我觉得,目前的水平,看官方文档可能不如直接SOF。
但是用途很广泛,搞数据分析和科研的常用。考虑到不加openpyxl得到的搜索引擎结果,靠前其实都是pandas解法。感觉需要处理数据的话,这个应该是逃不掉的。
- Joyful-Pandas 这个是看到的教程,感觉比较细,有大量的练习。
- pandas documentation 蛮多内容的,看不懂
- DataScience Made Simple 这个感觉是个数据科学方面的总结网站,有不少数据处理相关的内容,基本就围绕数据,是我喜欢的那种英文教学网站。
另外查找openpyxl的资料有几个网站还挺好:
- Openpyxl Tutorial 这个网站有一种直播式的观看感,非常细,但是不全。
- Python Openpyxl 这个也提供了另外一种追加数据的思路,(看了没试)