总结
一. hashlib的使用
使用前要先导入hashlib模块
hash摘要(加密)的算法主要有两类: md5和sha-x系列
1. hash加密的特点
1) hash算法生成的摘要不可逆(不能通过密文来获取原文)
2) 只有相同的时间通过相同算法得到的摘要才是一致的
3) 不管原数据多大, 产生的摘要的大小(长度)是一致的.
2. 生成hash摘要
1) 通过算法创建hash对象: hsshlib.算法名
算法名: md5, shaXXX
hash = hashlib.md5()
2) 添加数据
hash对象.update(数据)
注意: 数据必须是二进制数据, 类型是bytes
补充: 二进制和字符串之间的相互转换
字符串转二进制:
bytes(字符串, encoding='utf-8')
字符串.encode()
二进制转字符串
str(二进制, encoding='utf-8')
二进制,decode()
3.获取摘要
result = hash.hexdigest()
print(result) # 2c38b9e45cec1b324dde4e3d5b22c648
二. 数据持久化
程序中保存的数据默认都是保存在运行内存中的, 在程序运行结束的时候都会被释放
如果希望这个运行程序产生的数据在下次程序运行的时候还能用就需要将数据保存到硬盘中
将数据保存到硬盘的过程就是数据持久化的过程.
硬盘保存数据的基本单元是文件, 所以如果要将数据保存到硬盘中, 只需要将数据保存在文件中.
程序中数据持久化的常用文件类型:
数据库文件(.db , .sqlite等), plist文件(.plist), json文件, txt文件,
二进制文件(图片, 视频, 音频, exe可执行文件)
2. 文件操作 - 操作文件内容
文件操作基本流程: 打开文件 -> 操作文件(读, 写) -> 关闭文件
1) 打开文件
'''
open(file=, mode='r', *, encoding=None) - 以指定方式打开指定文件, 返回一个文件对象
a. file - 需要打开的文件在计算机中的位置信息(文件路径)
绝对路径: 文件在计算机中的全路径(一般从盘开始写)
相对路径: . - 表示当前目录(当前代码文件所在的文件夹), .\可以省略
.. - 表示当前目录的上层目录
b. mode - 文件打开方式, 决定打开文件后后续能对该文件进行的操作以及操作数据的类型
第一组:'r', 'w'-write(写), 'a'-append(追加) - 控制后续操作(是读还是写)
第二组: 't', 'b' - 控制操作数据的类型
第一组必须选一个, 第二组可以不选, 不选的时候默认是't'
'r' - 只读
'w' - 只写, 清空原文件内容
'a' - 只写, 会保留原文件内容
't' - 读到的数据和写的数据类型必须是字符串
'b' - 读操作返回的数据和写操作写入的数据必须是二进制
注意:
1. 二进制文件打开的时候必须带b
c. encoding - 文本文件的编码方式(需要保证写入数据采用什么的方式进行编码,读数据的时候就需要怎么进行解码)
一般采用utf-8, 但是很多windows文本默认编码方式是gbk
注意: 只有在以t的方式打开文本文件的时候才需要考虑给encoding赋值
'''
2) 关闭文件
文件对象.close()
3) 操作文件
a. 读操作
文件对象.read() - 从读写文字开始, 读到文件结束(读写位置默认在文件开头)
文件对象.readline() - 从读写位置开始, 读到一行结束
文件对象.readlines() - 从读写位置开始, 读到文件结束, 每读一行就将该行添加到列表中
f.seek(0) # 将读写位置移动到文件开头, 0表示距离文件开头的位置(不建议写其他数据, 容易报错)
b. 写操作
文件对象.write(数据) - 将数据写入指定文件中
三. 数据持久化
1. 怎么做到数据持久化
1) 用一个文件来保存需要持久化的数据
2) 程序中需要这个数据的时候就从文件中读取这个数据
3) 如果数据发生改变, 需要把最新的数据再写入文件中
2. eval函数 将字符串转换成去掉引号后的类型
作业
做一个登录界面
def land():
x = open('学生管理系统登录页面.txt', encoding='utf-8')
print(x.read())
x.close()
global y
y = int(input('请选择:'))
def login():
Id = open('ID.txt', encoding='utf-8')
new_id = eval(Id.read())
id1 = input('请输入用户名:')
pw = input('请输入密码:')
hash = hashlib.md5()
hash.update(bytes(pw, encoding='utf-8'))
pw1 = hash.hexdigest()
for x in new_id:
if id1 in x.keys():
print('注册失败!该ID已存在!')
break
else:
new_id.append({id1: pw1})
Id = open('ID.txt', 'w', encoding='utf-8')
Id.write(str(new_id))
Id.close()
print('注册成功!')
def landing():
id1 = input('请输入用户名:')
pw = input('请输入密码:')
Id = open('ID.txt', encoding='utf-8')
hash = hashlib.md5()
hash.update(bytes(pw, encoding='utf-8'))
pw = hash.hexdigest()
new_id = eval(Id.read())
for x in new_id:
if id1 in x.keys():
if pw == x[id1]:
print('登陆成功!')
return 1
else:
print('登陆失败!密码错误!')
break
else:
print('登陆失败!此ID无效!')
Id.close()
import hashlib
while True:
land()
if y == 1:
if landing():
break
if y == 2:
login()
if y == 3:
break
# 学生管理系统登录页面.txt
=================================================
学生管理系统登录页面
❀ 1. 登 录
❀ 2. 注 册
❀ 3. 退 出
=================================================
# ID.txt
[]