浅析Python中的序列化存储的方法


Posted in Python onApril 28, 2015

在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:

d = dict(name='Bob', age=20, score=88)

可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'。

我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

Python提供两个模块来实现序列化:cPickle和pickle。这两个模块功能是一样的,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢,跟cStringIO和StringIO一个道理。用的时候,先尝试导入cPickle,如果失败,再导入pickle:

try:
  import cPickle as pickle
except ImportError:
  import pickle

首先,我们尝试把一个对象序列化并写入文件:

>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
"(dp0\nS'age'\np1\nI20\nsS'score'\np2\nI88\nsS'name'\np3\nS'Bob'\np4\ns."

pickle.dumps()方法把任意对象序列化成一个str,然后,就可以把这个str写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:

>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()

看看写入的dump.txt文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。

当我们要把对象从磁盘读到内存时,可以先把内容读到一个str,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:

>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}

变量的内容又回来了!

当然,这个变量和原来的变量是完全不相干的对象,它们只是内容相同而已。

Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

Python 相关文章推荐
Python3实现生成随机密码的方法
Aug 23 Python
在Django框架中伪造捕捉到的URLconf值的方法
Jul 18 Python
举例讲解Python面相对象编程中对象的属性与类的方法
Jan 19 Python
python使用正则表达式来获取文件名的前缀方法
Oct 21 Python
Python 中Django安装和使用教程详解
Jul 03 Python
python编写计算器功能
Oct 25 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
python列表生成器迭代器实例解析
Dec 19 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
keras K.function获取某层的输出操作
Jun 29 Python
详解在Python和IPython中使用Docker
Apr 28 #Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 #Python
介绍Python中的文档测试模块
Apr 28 #Python
Django中几种重定向方法
Apr 28 #Python
详解Python的单元测试
Apr 28 #Python
Python xlrd读取excel日期类型的2种方法
Apr 28 #Python
Python发送email的3种方法
Apr 28 #Python
You might like
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
Ajax+Jpgraph实现的动态折线图功能示例
2019/02/11 PHP
用js写的一个路由(简单实例)
2016/09/24 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
Python常用的日期时间处理方法示例
2015/02/08 Python
python将ip地址转换成整数的方法
2015/03/17 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
python+requests接口自动化框架的实现
2020/08/31 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
产品工艺师的岗位职责
2013/11/15 职场文书
销售文员的岗位职责
2013/11/20 职场文书
六查六看自查材料
2014/02/17 职场文书
公关活动策划方案
2014/05/25 职场文书
2015年暑假生活总结
2015/07/13 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书