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}
posted @ 2021-05-28 17:45  豆#豆  阅读(349)  评论(0)    收藏  举报