pickle,struct,ujson,orjson 模块
1.pickle模块实现了用于序列化和反序列化python的对象二进制协议。也就是在python中特有模块,可以将特定数据类型序列化成只有python认识的字符串,pickle提供了四种方法,load,dump 主要是针对文件 ,loads和dumps主要针对于数据
序列化示并写入文件中
import pickle data = { 'a': [1, 2.0, 3, 4+6j], 'b': ("character string", b"byte string"), 'c': {None, True, False} } with open('mydata.pickle', 'wb') as myfile: pickle.dump(data, myfile)
反序列化示例
import pickle with open('mydata.pickle', 'rb') as myfile: data = pickle.load(myfile)
针对于数据序列化
1 # dumps功能 2 import pickle 3 data = ['aa', 'bb', 'cc'] 4 # dumps 将数据通过特殊的形式转换为只有python语言认识的字符串 5 p_str = pickle.dumps(data) 6 print(p_str) 7 b'\x80\x03]q\x00(X\x02\x00\x00\x00aaq\x01X\x02\x00\x00\x00bbq\x02X\x02\x00\x00\x00ccq\x03e.
反序列化
1 # loads功能 2 # loads 将pickle数据转换为python的数据结构 3 mes = pickle.loads(p_str) 4 print(mes) 5 ['aa', 'bb', 'cc']
pickle模块与json模块的对比
pickle模块实现的二进制转换协议与json模块实现的JSON格式转换协议完全不同。
JSON格式是一个文本序列化格式。pickle字节流格式是一个二进制序列化格式。
JSON是人可读的,而pickle字节流无法供人阅读。
JSON多用于与外部其他系统的交互,而pickle字节流仅供Python内部读写。
JSON只能表示Python内置类型,而pickle字节流可以表示开发人员定制类型。
struck模块:该模块在Python值和表示为Python bytes对象的C缓冲区结构体之间进行转换。可用于处理存储在文件中或者来自网络连接,以及其它来源的二进制数据。
struct.pack_into(ftm, buffer, offset, v1, v2, ...)
根据格式化字符串fmt
,封装v1
,v2
等值,并从位置offset
开始,将封装的字节写入可写缓冲区buffer
中。注意,offset
是必需的参数。
struct.unpack(fmt, buffer)
fmt
,从缓冲区buffer
(假设由pack(fmt, ...)
封装)中解包。即使结果只包含一项,也是一个元组。缓冲区的大小(以字节为单位)必需与格式所需的大小匹配,比如calcsize()
所得的结果。>>> from struct import * >>> pack('hhl', 1, 2, 3)// 将数据打包成二进制的字符串 b'\x00\x01\x00\x02\x00\x00\x00\x03' >>> unpack('hhl', b'\x00\x01\x00\x02\x00\x00\x00\x03')//将数据进行解包操作 (1, 2, 3) >>> calcsize('hhl') 8
ujson
-- JSON 编码和解码
这个模块实现了相应 CPython 模块的一个子集,如下所述。有关更多信息,请参阅原始CPython文档: json
此模块允许在Python对象和JSON数据格式之间进行转换。
函数
示例:
>>> obj = {1:2, 3:4, "a":6} >>> print(type(obj), obj) #原来为dict类型 <class 'dict'> {3: 4, 1: 2, 'a': 6} >>> jsObj = ujson.dumps(obj) #将dict类型转换成str >>> print(type(jsObj), jsObj) <class 'str'> {3: 4, 1: 2, "a": 6}
ujson.
load
(stream)-
解析给定的 stream ,将其解释为JSON字符串并将数据反序列化为Python对象。返回结果对象。
解析继续,直到遇到文件结尾。如果未正确形成流中的数据,则引发
ValueError
示例:
>>> obj = {1:2, 3:4, "a":6} >>> jsDumps = ujson.dumps(obj) >>> jsLoads = ujson.loads(jsDumps) >>> print(type(obj), obj) <class 'dict'> {3: 4, 1: 2, 'a': 6} >>> print(type(jsDumps), jsDumps) <class 'str'> {3: 4, 1: 2, "a": 6} >>> print(type(jsLoads), jsLoads) <class 'dict'> {'a': 6, 1: 2, 3: 4}
orjson
pip install -U orjson
json_byte = orjson.dumps(data, option=orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY)orjson.loads(json_byte)
以下列表包含一些最常用的整数常量:
OPT_APPEND_NEWLINE — Append \n to the output. OPT_APPEND_NEWLINE —在输出中附加\n 。 OPT_INDENT_2 — Pretty-print output with an indent of two spaces. OPT_INDENT_2 —缩进两个空格的漂亮打印输出。 OPT_NAIVE_UTC — Serialize datetime.datetime objects without a tzinfo as UTC. This has no effect on datetime.datetime objects that have tzinfo set. OPT_NAIVE_UTC —将没有tzinfo datetime.datetime对象序列化为UTC。 这对设置了tzinfo datetime.datetime对象没有影响。 OPT_NON_STR_KEYS — Serialize dict keys of type other than string. This option is slower for string keys than the default. OPT_NON_STR_KEYS —序列化字符串以外类型的字典键。 对于字符串键,此选项比默认值慢。 OPT_OMIT_MICROSECONDS — Do not serialize the microsecond field on datetime.datetime and datetime.time instances. OPT_OMIT_MICROSECONDS —不要序列化datetime.datetime和datetime.time实例上的微秒字段。 OPT_SERIALIZE_NUMPY — Serialize numpy.ndarray instances. OPT_SERIALIZE_NUMPY —序列化numpy.ndarray实例。 OPT_SORT_KEYS — Serialize dict keys in sorted order. The default is to serialize in an unspecified order. OPT_SORT_KEYS —按排序顺序对字典键进行序列化。 默认值是未指定顺序进行序列化。 OPT_STRICT_INTEGER — Enforce 53-bits limit on integers instead of the standard 64-bits.Q OPT_STRICT_INTEGER —对整数(而不是标准的64位)强制执行53位限制。
文件读/写 (File Read/Write)
通常可以通过write()
函数轻松地将字节内容保存到文件中。 但是,您需要在mode参数中包含b
。 让我们看一下下面的代码片段。
with open("example.json", "wb") as f: f.write(orjson.dumps(data))
同样,从文件读取很简单,如下所示:
with open("example.json", "rb") as f: json_data = orjson.loads(f.read())