什么是序列化?
序列化是指把内存里的数据类型转变成字符串,使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接收bytes。
为什么要序列化?
我们编写的程序,会涉及到各种各样的对象、数据结构,它们通常是以变量的形式在内存中存在着。当程序运行结束后,这些变量也就会被清理。但我们有时希望能够在下一次编写程序时恢复上一次的某个对象(如机器学习中的到结果,需要程序运行较长时间,多次运行时间成本太大),这就需要我们将变量进行持久化的存储。一种方式是利用文件读写的方式将变量转化为某种形式的字符串写入文件内,但需要自己控制存储格式显得十分笨拙。更好的方式是通过序列化的方式将变量持久化至本地。
用于序列化的两个模块:
-
- json, 用于字符串和Python数据类型间进行转换。
- pickle,用于Python的特有的类型和Python的数据类型间进行转换。
JSON
import json data = {"k1":"v1","k2":"v2"} # json.dumps() 把数据通过特殊的形式转换为所有程序语言都认识的字符串并写入文件 with open("Test.txt","w") as f: json_str = json.dump(data,f) # json.load() 将序列化字符串从文件读取并反序列化 with open("Test.txt","r") as f: print(json.load(f))# 结果是:{‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘} # json.dumps() 把数据通过特殊的形式转换为所有程序语言都认识的字符串 json_str1 = json.dumps(data) print(json_str1)# 结果是:{"k1": "v1", "k2": "v2"} #json.loads 将序列化字符串反序列化 json_str2 = json.loads(json_str1) print(json_str2)# 结果是:{‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}
JSON
pickle
import pickle data = {"k1":"v1","k2":"v2"} # pickle.dumps() 把数据通过特殊的形式转换为只有Python认识的字符串并写入文件 with open("Test1.txt","wb") as f: pickle_str = pickle.dump(data,f) # pickle.load() 将序列化字符串从文件读取并反序列化 with open("Test1.txt","rb") as f: print(pickle.load(f))# 结果是:{‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘} # pickle.dumps() 把数据通过特殊的形式转换为所有程序语言都认识的字符串 pickle_str1 = pickle.dumps(data) print(pickle_str1)# 结果是:b‘\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04u.‘ #pickle.loads 将序列化字符串反序列化 pickle_str2 = pickle.loads(pickle_str1) print(pickle_str2)# 结果是:{‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}
pickle
两者比较
JSON:
优点:跨语言,体积小
缺点:只支持:int|str\list\tuple\dict
pickle:
优点:专为Python设计,支持Python所有数据类型
缺点:只有Python认识,存储数据占空间大
原文地址:https://www.cnblogs.com/Ojia/p/9496010.html
时间: 2024-10-08 10:21:59