序列化模块(json)
# 序列就是字符串,序列化是把其他数据类型转为json字符串的过程
# 反序列化:把json字符串转为其他数据类型的过程就是反序列化
"""json字符串 json对象"""
在Python中把其他数据类型转为json需要使用json模块
import json
json模块中与四个方法
json.dumps---->序列化用的 json.loads------》反序列化 json.dump------》序列化,它可以直接写入文件 json.load-----------》它能够读取文件,然后自动反序列化
1. 把字典类型转为json格式的数据
import json d = {"username":"kevin", 'age':18} # {"username": "kevin", "age": 18} print(type(d)) # dict print(json.dumps(d), type(json.dumps(d))) # <class 'str'> """{"username": "kevin", "age": 18} json格式的数据特点:字典里面的都变成了双引号"""
2.反序列化:java给你发送了数据------------》
通过网络传输的数据一定是二进制
res = b'{"username": "kevin", "age": 18}' # 把二进制数据转为Python中得字典 s1 = res.decode('utf-8') # 二进制解码 {"username": "kevin", "age": 18} d1 = json.loads(s1) print(d1['username']) # 反序列后就可以正常字典取值了 """字节类型------》字符串-----------》字典"""
3、把字典格式的数据写入到文件中,读数据也是字典
d = {'username':'jerry', 'age':18} with open('a.txt', 'w', encoding='utf-8') as f: f.write(str(d)) f.write(json.dumps(d)) with open('a.txt', 'r', encoding='utf-8') as f1: res=eval(f1.read()) # {'username': 'jerry', 'age': 18} print(res, type(res)) # dict
# 非常方便的写入文件 with open('a.txt', 'w', encoding='utf-8') as f: json.dump(d, f) # 1. 先把数据序列化,2. 把数据write进去 with open('a.txt', 'r', encoding='utf-8') as f1: res=json.load(f1) # {'username': 'jerry', 'age': 18} print(res, type(res))
"""补充扩展"""
d = {'username':'jerry你好啊', 'age':18} print(json.dumps(d)) # {"username": "jerry\u4f60\u597d\u554a", "age": 18} print(json.dumps(d,ensure_ascii=False))
有时候可以查看源码来学习一些新东西,以后遇到函数不知道怎么用,就要追代码。
ctrl + 点击 追源码
pickle模块
pickle的使用方式跟json一模一样,json中有四个方法,pickle也是这四个方法
# 能够被序列化的数据类型不一样,json能够序列化的数据类型是有限的
json有:dict list, tuple str int, float True False None
pickle能够序列化的类型:所有数据类型
# 不好的地方在于,被pickle处理之后的数据只能够在自己语言中使用
pickle序列化之后的结果是二进制的
d = {"a":1, 'b':2} import pickle res = pickle.dumps(d) # b'\x80\x04\x95\r\x00\x00\x00\x0...' print(pickle.loads(res)) # 反序列 with open('a.txt', 'wb') as f: pickle.dump(d, f) with open('a.txt', 'rb') as f: print(pickle.load(f))
hashlib模块
摘要算法又称哈希算法、散列算法。
它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常是16进制字符)
import hashlib # 1、先指定使用的加密算法:MD5 sha系列 sha1 sha128 sha256等 m = hashlib.md5() # 加密数据的时候,使用的是md5算法 m.update(b'123456') # 2. 指定需要加密的数据 print(m.hexdigest()) # 取出加密之后的结果 # e10adc3949ba59abbe56e057f20f883e """不管多长,加密后长度是固定的 加密后不能反推出明文"""
# 被加密的密文越长,被破解的难度就越大,但是数据传输需要占用的资源就越大
import hashlib m = hashlib.sha1() m.update('hello',encode('utf-8')) print(m.hexdigest()) # e3kcxck34453ekd.... '''sha系统一般只会用于支付宝支付'''
hashlib之注册登录
注册:
import hashlib import random def get_code(n): # 设置随机数函数 code = '' for i in range(n): random_int = str(random.randint(0, 9)) random_upper = chr(random.randint(65, 90)) random_lower = chr(random.randint(97, 122)) temp = random.choice([random_int, random_upper, random_lower]) code += temp return code username = input('username:>>>').strip() password = input('password:>>>').strip() # 用户输入密码 random_str = get_code(4) s_passowrd = password + random_str # 注册密码加随机干扰项,调用函数 m = hashlib.md5() m.update(s_passowrd.encode('utf-8')) new_pwd = m.hexdigest()[0:16] # 取加密十六位 data = '%s|%s|%s\n' % (username, new_pwd, random_str) # 定义写入的格式 with open('userinfo.txt', 'a', encoding='utf-8') as f: # 写入文件保存 f.write(data)
登录:
username = input('username:>>>').strip() password = input('password:>>>').strip() # 用户输入 with open('userinfo.txt', 'r', encoding='utf-8') as f: # 读取文件里的内容 real_username, real_password, random_str = f.read().split('|') # 解压赋值 s_passowrd = password + random_str # 将登录密码加上随机数再进行加密 m = hashlib.md5() m.update(s_passowrd.encode('utf-8')) new_pwd = m.hexdigest()[0:16] if username == real_username and new_pwd == real_password: print('密码正确') # 将登录输入的密码与文件中的密码相比对是否相等 else: print('用户名和密码不正确')