Python 序列化之json&pickle模块

json & pickle 模块

用于序列化的两个模块(所谓序列化,就是把变量从内存中变成可存储或可传输的过程。序列化之后便可以存储在硬盘上,并可以传输至别的机器上,再通过反序列化,便可以获得之前的变量内容)

  • json,用于字符串 和 python数据类型间进行转换
  • pickle,用于python特有的类型 和 python的数据类型间进行转换,该模块也是python特有的模块,可以保存当前状态,俗称挂起。

Json模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load

pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load  (不仅可以序列化字典,列表...还可以把一个程序,一个类给序列化掉)

json模块

首先,我们声明一个字典s,通过dumps方法将s进行序列化,此时可以将序列化的结果写到文本中(都是字符串的格式),即为存档。

之后,通过loads方法对序列化后的结果进行反序列化,得到之前的变量信息s,即为读档。

1 import json
2 s = {"desc":"invilad-citykey", "status":1002}
3 
4 result = json.dumps(s)   # 序列化
5 result1 = json.loads(result)  #反序列化
6 
7 print(result, type(result))
8 print(result1, type(result1))

执行上述代码,如下图所示,第一行是序列化的结果,可以看出,json将字典转换成一个类型为字符串格式的序列化结果;第二行是反序列化的结果,其将之前序列化的结果又转化成为字典s。

同样,对于列表,也可以通过同样的方式进行序列化和反序列化。

1 Company = ['ALi','tencent','BAIDU']
2 result2 = json.dumps(Company)
3 result3 = json.loads(result2)
4 print(result2, type(result2))
5 print(result3, type(result3))

执行上述代码,如下图所示,第一行是序列化的结果,可以看出,json将列表转换成一个类型为字符串格式的序列化结果;第二行是反序列化的结果,其将之前序列化的结果又转化成为列表Company。

扫描二维码关注公众号,回复: 2780753 查看本文章

dump的功能可以直接将序列化的结果写入文件中,load也可以直接从文件中读取并反序列化。

dump:

1 obj = ['foo', {'bar': ('baz', None, 1.0, 2)}]
2 with open(r"c:\json.txt","w+") as f:
3     json.dump(obj, f)

load:

1 with open(r"c:\json.txt","r") as f:
2     print json.load(f)

但是,当存在较为复杂的数据类型时,json却不能够很好的序列化。比如,我们在字典中添加函数:

1 def sayhi(name):
2     print("hello,",name)
3 s = {"desc":"invilad-citykey", "status":1002, "func": sayhi}
4 
5 result = json.dumps(s)   # 序列化
6 result1 = json.loads(result)  #反序列化
7 
8 print(result, type(result))
9 print(result1, type(result1))

执行上述代码,结果如下,显示json没有类型为函数的序列化。

因此,JSON在python中分别由list和dict组成。

pickle模块

pickle模块的用法和json模块没用太大的区别,但其可以实现上述需求。

 1 import pickle
 2 
 3 def sayhi(name):
 4     print("hello,",name)
 5 s = {"desc":"invilad-citykey", "status":1002, "func": sayhi}
 6 
 7 result = pickle.dumps(s)   # 序列化
 8 result1 = pickle.loads(result)  #反序列化
 9 
10 print(result, type(result))
11 print(result1, type(result1))

 上述字典中包含函数,利用pickle模块可以实现序列化与反序列化。

区别:

1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。

2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。

猜你喜欢

转载自www.cnblogs.com/monologuesmw/p/9483338.html