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’)

参考:

  1. my coding.net
  2. https://www.jianshu.com/p/038eac4f1f69
  3. Python中的序列化和反序列化
  4. python 序列化和反序列化