python模块学习-pickle模块
base64编码工具函数
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,
Base64就是一种基于64个可打印字符来表示二进制数据的方法。
64个可打印编码字符就是小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)
base64的使用一般无非就是编码和解码:
编码是从二进制到编码字符的过程,可用于在HTTP环境下传递较长的标识信息。例如:图片内容
解码是从编码字符到二进制的过程
在python中,base64是内置常用的标准模块,我们可以直接通过import导入base64模块直接使用。
代码:
import json, base64
if __name__ == '__main__':
# 要编码的原始数据
data = {"uname":"root","uid":1}
print(data)
# 先转换成bytes类型数据
data_bytes = json.dumps({"uname": "root", "uid": 1}).encode()
print(data_bytes)
# 编码
base_data = base64.b64encode(data_bytes)
print(base_data)
# 解码
str_bytes = b'eyJ1bmFtZSI6ICJyb290IiwgInVpZCI6IDF9'
ori_data = base64.b64decode(str_bytes).decode()
# 字符串
print(ori_data)
# 变回原来的字典
data = json.loads(ori_data)
print(data)
pickle 模块
pickle是一种把python对象转换为便于存储在文件或数据库中,和可以在网络进行传输的二进制或文本格式的编码方法
pickle 模块主要提供了两个功能,一个是将python对象转换成字节流,即序列化;另一个是将字节流转换成python对象,即反序列化。
每个功能又分出了两个分支,一个是仅将python对象转换成字节流,另一个是将python对象转换成字节流并保存到文件中去(保存文件的后缀为”.pkl”).
pickle 是python语言的一个内置模块,可以直接通过import导入pickle模块直接使用.
代码:
import pickle
if __name__ == "__main__":
# 原始数据
data = {"username": "rosa", "pwd": 123}
# 1. 序列化
# (1)直接序列化成字节流:dumps()
data_bytes = pickle.dumps(data)
print(data_bytes)
# b'\x80\x03}q\x00(X\x08\x00\x00\x00usernameq\x01X\x04\x00\x00\x00rosaq\x02X\x03\x00\x00\x00pwdq\x03K{u.'
# (2) 序列化之后保存到文件中去: dump()
with open("data.pkl", mode="wb") as fp:
pickle.dump(data,fp)
#2. 反序列化
# (1)直接将序列化的字节流反序列为python对象 : loads()
data_bytes = b'\x80\x03}q\x00(X\x08\x00\x00\x00usernameq\x01X\x04\x00\x00\x00rosaq\x02X\x03\x00\x00\x00pwdq\x03K{u.'
data = pickle.loads(data_bytes)
print(data) # {'username': 'rosa', 'pwd': 123}
# (2)将二进制文件直接反序列为python对象 : load()
with open("data.pkl","rb") as fp :
data = pickle.load(fp)
print(data) #{'username': 'rosa', 'pwd': 123}
struct模块
struct模块用于字符串str和其他二进制数据类型的转换
在struct模块中最最常用的2个方法:
(1)struct.pack:按照给定的格式 ,把python数据转换成字符串(字节流),并将该字符串返回.
(2)struct.unpack: 刚好与struct.pack相反,用于将字节流解析成python数据类型,并返回解析结果(返回一个元组)。
处理二进制数据,如果用struct来处理文件的话,需要用’wb’,’rb’以二进制(字节流)写,读的方式来处理文件;
struct模块时python内置的模块,直接import引入应用即可.
代码:
import struct
if __name__ == "__main__":
data = 1234567891
#1 .打包 pack
# i => int 要转换的数据为整型
data_bytes = struct.pack("i", data)
print(data_bytes, len(data_bytes)) # b'\xd3\x02\x96I' 4
#2 . 解包 unpack
# i => int 把数据转换成整型
tup = struct.unpack("i", b'\xd3\x02\x96I')
print(tup) #(1234567891,)
# 通过0下标取出数据
print(tup[0], type(tup[0])) # 1234567891 <class 'int'>
# 转换的数值范围存在上限
"""
上限范围 : -2147483648 <= number <= 2147483647
-21亿 ~ 21亿左右
"""
orjson模块
orjson是一个高效率且快速的python JSON库.它基准测试是最快的用于JSON序列化的Python库,其性能是最近的其他库的1.6倍到2.6倍,反序列化性能是最近的其他库的0.95倍到1.2倍.
orjson是一个独立的第三方包,需要在python环境中安装,安装完了之后直接用import引用就可以使用.
代码:
import orjson
if __name__ == "__main__":
# 原始数据
data = {"username": "rosa", "pwd": 123}
# 1. 序列化
# (1)直接序列化成json字节流:dumps()
data_str = orjson.dumps(data)
print(data_str ,type(data_str))
# b'{"username":"rosa","pwd":123}'
#2. 反序列化
# json字节流反序列为python对象 : loads()
data = orjson.loads(data_str)
print(data)
# {'username': 'rosa', 'pwd': 123}
data = {
"emoji_tears": "😂",
"emoji_clock": "⏰",
"integer": 123,
"float": 10.4,
"boolean": False,
"list": ["element1", "element2"],
"dict": {"key1": "value1", "key2": "value2"},
"russian": "Привет",
"chinese": "您好",
"japanese": "こんにちは"
}
json_byte = orjson.dumps(data)
print(json_byte)
print(orjson.loads(json_byte))
ujson模块
ujson是用纯C语言编写的超快速JSON编码器和解码器.
ujson是一个独立的第三方包,需要在python环境中安装,安装完了之后直接用import引用就可以使用.
代码:
import ujson
ujson.dumps([{"key": "value"}, 81, True])
# '[{"key":"value"},81,true]'
ujson.loads("""[{"key": "value"}, 81, true]""")
# [{u'key': u'value'}, 81, True]
itsdangerous模块
itsdangerous是python的第三方库,其内部是基于HMAC和SHA1进行数据加密的,是一种安全的基于加密hash函数和共享密钥的消息认证协议
itsdangerous是python的第三方库,需要安装之后,在用import引入使用
代码:
import time
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
serializer = Serializer('密钥', 2) # 密钥 和 加密时间
info = {"id": 3}
# 加密
mi_info = serializer.dumps(info)
print(mi_info)
'''
b'eyJhbGciOiJIUzUxMiIsImlhdCI6MTYyMjE5MjkzMCwiZXhwIjoxNjIyMTkyOTM1fQ.eyJpZCI6M30.UiwZi3qLw90mDWi8NHuWbFugKsUgH2b_AspktmpMxnIotE1SglVC2b1311hKMA9bHqM3vfM4hJWx7Ph8DfXJDg'
'''
print(type(mi_info)) # 加密后是bytes类型<class 'bytes'>
mi_info = mi_info.decode() # 变成字符串
print( mi_info)
# eyJhbGciOiJIUzI1NiIsImlhdCI6MTU1NzkyODU4NCwiZXhwIjoxNTU3OTI4NTg5fQ.eyJpZCI6M30.tGR4F7JTqx5zRImTW7Alrra7hMG12ViV7AA0-FYVLwg
# time.sleep(5) # 如果超时>2就会报错
time.sleep(2) # success
# 解密
yuan_info = serializer.loads(mi_info)
print(yuan_info) #{'id': 3}

浙公网安备 33010602011771号