0.索引
1.json序列化变量
2.numpy序列化ndarray
3.pickle序列化变量
序列化 (Serialization)是指将对象、数据结构的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
我们编写的程序,会涉及到各种各样的对象、数据结构,它们通常是以变量的形式在内存中存在着。当程序运行结束后,这些变量也就会被清理。但我们有时希望能够在下一次编写程序时恢复上一次的某个对象(如机器学习中的到结果,需要程序运行较长时间,多次运行时间成本太大),这就需要我们将变量进行持久化的存储。一种方式是利用文件读写的方式将变量转化为某种形式的字符串写入文件内,但需要自己控制存储格式显得十分笨拙。更好的方式是通过序列化的方式将变量持久化至本地。
本文主要针对python中的序列化操作进行记录,定期更新python中的涉及到的序列化问题,以作备忘。
1.json序列化变量
序列化对象至本地文件:
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
对应的反序列化方法:
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
序列化对象至字符串:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
对应的反序列化方法:
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
2.numpy序列化ndarray
序列化array:np.save(file, arr, allow_pickle=True, fix_imports=True)
序列化并压缩:np.savez(file, *args, **kwds)
反序列化array:numpy.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding='ASCII')
示例如下:
np.save('/tmp/123.npy', np.array([[1, 2, 3], [4, 5, 6]]))
np.load('/tmp/123.npy')
#array([[1, 2, 3],
# [4, 5, 6]])
a=np.array([[1, 2, 3], [4, 5, 6]])
b=np.array([1, 2])
np.savez('/tmp/123.npz', a=a, b=b)
data = np.load('/tmp/123.npz')
data['a']
#array([[1, 2, 3],
# [4, 5, 6]])
data.close()
3.pickle序列化变量
pickle和json一样也是python内置的序列化模块。与json相比,pickle的序列化结果虽然不可读,但其可以直接序列化自定义的对象,甚至连递归存储变量、引用变量都可以序列化,不必再像json一样设计自定义的jsonEncoder,带来了极大便利。
序列化对象至本地:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
对应的反序列化方法:
pickle.load(file, *, fix_imports=True, encoding=”ASCII”, errors=”strict”)
示例如下:
import pickle
# An arbitrary collection of objects supported by pickle.包括自定义的对象。
data = {
'a': [1, 2.0, 3, 4+6j],
'b': ("character string", b"byte string"),
'c': {None, True, False}
}
with open('data.pickle', 'wb') as f: # 此处需指定模式为写入字节流,因为pickle是将object转换为二进制字节流
# Pickle the 'data' dictionary using the highest protocol available.
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL) # 采用最新的协议,扩展性较好
with open('data.pickle', 'rb') as f: # 读入时同样需要指定为读取字节流模式
# The protocol version used is detected automatically, so we do not
# have to specify it.
data = pickle.load(f)