Python中的序列化以及pickle和json模块介绍
来源:互联网 发布:mac需要清理软件吗 编辑:程序博客网 时间:2024/06/05 10:37
Python中的序列化指的是在程序运行期间,变量都是在内存中保存着的,如果我们想保留一些运行中的变量值,就可以使用序列化操作把变量内容从内存保存到磁盘中,在Python中这个操作叫pickling,等下次再使用保存的变量时,可以通过反序列化操作提取数据内容到内存,即unpickling
我们先来介绍pickle模块,它就是Python提供用来序列化对象的模块,假如现在我们把一个对象序列化。
import pickled=dict(name='zhangkang',age=20,sex='man')#以二进制的方式写入pk.txtwith open('pk.txt','wb') as f: pickle.dump(d,f)
这样在当前程序运行目录就会生成一个pk.txt文件,里面保存着d对象,下面我们把序列化的对象内容提取出来,也就是反序列化。
import picklewith open('pk.txt','r') as f: d=pickle.load(f)print(type(d))print(d)输出:<type 'dict'>{'age': 20, 'name': 'zhangkang', 'sex': 'man'}
**pickle.dump()直接把对象序列化后写入一个file-like Object:
pickle.load()方法从一个file-like Object中直接反序列化出对象**
当然我们也可以使用pickle.dumps()方法把对象序列化成一个str,然后,就可以把这个str写入文件。当我们要把对象从磁盘读到内存时,可以先把内容读到一个str,然后用pickle.loads()方法反序列化出对象
import pickled=dict(name='zhangkang',age=20,sex='man')s=pickle.dumps(d)#先看下s的类型和内容print(type(s))print(s)print('\n')#把s保存到文件,再从文件读取,就是文件#操作的内容了,本程序不演示了,现在我们把s#反序列化ss=pickle.loads(s)print(type(ss))print(ss)输出:<type 'str'>(dp0S'age'p1I20sS'name'p2S'zhangkang'p3sS'sex'p4S'man'p5s.<type 'dict'>{'age': 20, 'name': 'zhangkang', 'sex': 'man'}
json模块
假如我们需要在不同的编程语言之间传递对象,就需要把对象序列化成标准格式,类型于XML,但是序列化成json比XML更好,速度也更快,并且可以直接在web页面读取,序列成json后其实就是个字符串,任何语言都能读取,也可以方便的存储到磁盘或者通过网络传输。
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
json类型——Python类型
{ }——dict
[ ]——,list
string——str或者u’unicode’
true/false——True/False
null ——None
Python内置的json模块提供了完善的Python对象到json格式的转换。先看看如何把Python对象变成一个json:
import jsond=dict(name='zhangkang',age=20,score=88)#这里dumps(),loads(),dump(),load()的用法和pickle模块一样a=json.dumps(d)print(type(a))#这里输出的字符串和上面讲的pickle的不同,格式变了。print(a)print('\n')c=json.loads(a)print(type(c))#这里注意,所有反序列化后的字符串对象类型不是str,而是unicode,因为#JSON标准规定JSON编码是UTF-8,所以我们总能在Python的str或unicode与JSON的字符串之间转换。print(c)输出:<type 'str'>{"age": 20, "score": 88, "name": "zhangkang"}<type 'dict'>{u'age': 20, u'score': 88, u'name': u'zhangkang'}
如果我们要对一个类对象序列化成标准格式:
import jsonclass People(object): def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sexdef people_dict(p): d=dict() d['name']=p.name d['age']=p.age d['sex']=p.sex return dp=People('zhangkang',24,'man')js_p=json.dumps(p,default=people_dict)print(type(js_p))print(js_p)输出:<type 'str'>{"age": 24, "name": "zhangkang", "sex": "man"}
默认情况下,dumps()方法不知道如何将People()实例变为一个json的{ }对象。可选参数default就是把任意一个对象变成一个可序列为json的对象,我们只需要为People专门写一个转换函数,再把函数传进去。People()实例首先被people_dict()函数转换成dict,然后再被顺利序列化为json。
如何把类对象反序列化呢?
import jsonclass People(object): def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sexdef people_dict(p): d=dict() d['name']=p.name d['age']=p.age d['sex']=p.sex return ddef dict_people(d): return People(d['name'],d['age'],d['sex'])#序列化p=People('zhangkang',24,'man')js_p=json.dumps(p,default=people_dict)print(type(js_p))print(js_p)print('\n')#反序列化pp=json.loads(js_p, object_hook=dict_people)print(type(pp))print(pp.name)print(pp.age)print(pp.sex)输出:<type 'str'>{"age": 24, "name": "zhangkang", "sex": "man"}<class '__main__.People'>zhangkang24man
我们要把json反序列化为一个People对象实例,loads()方法首先把js_p转换成一个dict对象,然后把这个dict传入object_hook函数被转换为People实例。
- Python中的序列化以及pickle和json模块介绍
- python序列化模块json和pickle
- python 中的pickle数据序列化模块
- Python序列化模块pickle
- Python pickle序列化模块
- python pickle模块 序列化
- Python中的json与pickle模块
- python中内置函数和json、pickle数据序列化
- Python:pickle模块(序列化)
- pickle, cPickle 模块:序列化 Python 对象
- python序列化存储模块:Pickle
- Python序列化——pickle模块
- Python 之 pickle/json序列化
- Python-json与pickle数据序列化
- python pickle模块 json模块
- python中的pickle模块
- python中的pickle模块
- Python 序列化 与 反序列化 JSON 与 pickle 模块
- 深入理解extern用法
- 1073. 多选题常见计分法(20)
- eclipse中解决svn连接时数字证书问题
- oracle中视图的创建和使用
- SpringMVC中文件上传后表单其他属性为空
- Python中的序列化以及pickle和json模块介绍
- Error: Activity used to start app doesn’t exist or cannot ve launched!
- Python 错误之函数takes 0 positional arguments but 1 was given
- JPush极光推送代码(已弃用,请参照另一篇)
- AJAX请求参数数组解决办法
- C++函数传参问题
- Spark 2.0核心技术图解
- 解决gradle管理依赖中 出现servlet-api.jar冲突的问题。
- 定时删除超期文件(windows+linux)