Python序列化与反序列化
python用于序列化的两个模块: json, pickle
json:用于字符串和Python数据类型间进行转换
pickle: 用于python特有的类型和python的数据类型间进行转换
json提供四个功能:dumps,dump,loads,load
pickle提供四个功能:dumps,dump,loads,load
1. pickle
支持所有python的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。 由任何原生类型组成的列表,元组,字典和集合。 函数,类,类的实例
pickle模块中常用的方法有:
pickle.dump(obj, file, protocol=None,)
dump 将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件
必填参数obj表示将要封装的对象
必填参数file表示obj要写入的文件对象,file必须以二进制可写模式打开,即“wb”
可选参数protocol表示告知pickler使用的协议,
支持的协议有0,1,2,3,默认的协议是添加在Python 3中的协议3。
with open('D:/tmp.pk', 'w') as f:
pickle.dump(data, f)
pickle.load(file,*,fix_imports=True, encoding=”ASCII”, errors=”strict”)
必填参数file必须以二进制可读模式打开,即“rb”,其他都为可选参数 load 从数据文件中读取数据,并转换为python的数据结构
with open('D:/tmp.pk', 'r') as f:
data = pickle.load(f)
pickle.dumps(obj):以字节对象形式返回封装的对象,不需要写入文件中
pickle.loads(bytes_object): 从字节对象中读取被封装的对象,并返回
2.json
JSON(JavaScript object notation,JS 对象标记)是一种轻量级的数据交换格式,它基于ECMAscript(w3c制定的JS规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据
JSON的数据类型:
其key必须是字符串,其值可以是下面类型:
双引号引起来的字符串,数值,true和false,null(None),对象(字典),数组(列表)这些都是值
常用方法:
dumps json 编码
dump json 编码并存入文件
loads json 解码
load json 解码,从文件读取数据
3.messagepack
messagepack 是一个基于二进制高效的对象序列化类库,可用于跨语言通信,其可以像JSON那样,在许多语言之间交换结构对象,但是其比JSON更快速更轻巧。其支持python,ruby,Java,C/C++等众多语言,兼容JSON和pickle
常用方法
packb 序列化对象,提供了dumps来兼容pickle和json
unpackb 反序列化对象,提供了loads来兼容
pack序列化对象保存到文件对象,提供了dump来兼容
unpack 反序列化对象保存到文件对象,提供了load来兼容
4.读取文件出现\UFEFF
在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。
什么是BOM?
BOM = Byte Order Mark
BOM是Unicode规范中推荐的标记字节顺序的方法。比如说对于UTF-16,如果接收者收到的BOM是FEFF,表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明“我是UTF-8编码”。BOM的UTF-8编码是EF BB BF(用UltraEdit打开文本、切换到16进制可以看到)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
方案一:检查原文件,Notepad++是一个很好的代码查看器,“编码”选项可以查看或重设编码方式,编码是“ UTF-8 BOM”,将其改为:‘ UTF-8’
方案二:查询网上的另一种方案:
f = open(r’a.txt’, encoding=’utf-8-sig’)
参考: