Python 常用模块- json/pickle序列化/反序列化
Python 常用模块- json/pickle序列化/反序列化
http://www.cnblogs.com/alex3714/articles/5161349.html
1.1. json/pickle序列化/反序列化
https://www.cnblogs.com/tkqasn/p/6005025.html
1.1.1.什么是序列化?
https://baike.baidu.com/item/%E5%BA%8F%E5%88%97%E5%8C%96/2890184?fr=aladdin
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
目的:
例如 字典转换成字符串 用于传输和存储(序列化),字符串转成字典 用于调用和识别(反序列化)。
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。
1.1.2.区别和相同:
pickle是Python独有的,json是所有语言都支持的。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
python的pickle模块实现了python的所有数据序列和反序列化。基本上功能使用和JSON模块没有太大区别,方法也同样是dumps/dump和loads/load。cPickle是pickle模块的C语言编译版本相对速度更快。
与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。
pickle反序列化后的对象与原对象是等值的副本对象,类似与deepcopy。
json和pickle模块,两个都是用于序列化的模块
• json模块,用于字符串与python数据类型之间的转换,字典,元祖,列表等。
• pickle模块,用于python特有类型与python数据类型之间的转换,几乎所有的数据类型。
例如Pickle 可以把函数序列化,而json不能。
两个模块,都提供了dumps,dump,loads,load 4个功能
1.1.3.pickle
1.1.3.1. 序列化
1.1.3.1.1. dumps 将对象序列化
import pickle f = open('user_acc.txt','wb') info = { 'wangxu': '123', 'jack': '456' } f.write(pickle.dumps(info)) # d = pickle.dumps(info) # f.write(d) f.close() dumps /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day5/模块/序列化.py 进程已结束,退出代码0
1.1.3.1.2.dump将对象序列化并保存到文件
import pickle f = open('user_acc.txt','wb') info = { 'wangxu': '123', 'jack': '456' } pickle.dump(info,f) f.close() /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day5/模块/序列化.py 进程已结束,退出代码0
1.1.3.2. 反序列化
1.1.3.2.1.loads将序列化字符串反序列化
import pickle f = open('user_acc.txt','rb') a = pickle.load(f) print(a) print(type(a)) for k in a: print(k) for k,v in a.items(): print(k+":"+v)
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day5/cc/序列化个人.py
{'wangxu': '123', 'jack': '456'}
<class 'dict'>
wangxu
jack
wangxu:123
jack:456
进程已结束,退出代码0
1.1.3.3. user_acc.txt 是乱码的you
�
}q(XwxqX
1111qX
jackq
X
2222q
1.1.4. json
1.1.4.1. 序列化
#import pickle import json f = open('user_acc.txt','w') info = { "wx":'1111', 'jack':'2222' } f.write(json.dumps(info)) f.close()
1.1.4.2. 反序列化
import json f = open('user_acc.txt','r') data = json.loads(f.read()) for i in data: print(i) print(data) print(type(data))
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day5/模块/序列化个人.py
wx
jack
{'wx': '1111', 'jack': '2222'}
<class 'dict'>
进程已结束,退出代码0
1.1.4.3. user_acc.txt 不是乱码呦
{"wx": "1111", "jack": "2222"}
1.1.5. dumps和dump区别
#dumps 执行序列化
#dump 执行序列化并写到文件中(参数跟文件名)。相当于dumps两步合一
import pickle,json f = open('user_acc.txt','w') info = { 'wangxu': '123', 'jack': '456' } #f.write(json.dumps(info)) #dumps 执行序列化 json.dump(info,f) #dump 执行序列化并写到文件中(参数跟文件名)。 f.close()
1.1.6. loads和load区别
#loads 执行发序列化
#load 打开文件并执行反序列化(参数跟文件名)。相当于loads二步合一
import pickle,json f = open('user_acc.txt','r') #c = json.loads(f.read()) c = json.load(f) print(c) for i in c: print(i)