浅析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 相关文章推荐
零基础写python爬虫之神器正则表达式
Nov 06 Python
Python标准库之多进程(multiprocessing包)介绍
Nov 25 Python
编写简单的Python程序来判断文本的语种
Apr 07 Python
在Python中使用next()方法操作文件的教程
May 24 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
python实现发送邮件功能
Jul 22 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 Python
什么是python的必选参数
Jun 21 Python
python判断变量是否为列表的方法
Sep 17 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面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
php防止sql注入的方法详解
2017/02/20 PHP
javascript String 对象
2008/04/25 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
python查看zip包中文件及大小的方法
2015/07/09 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
django实现用户注册实例讲解
2019/10/30 Python
python__new__内置静态方法使用解析
2020/01/07 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
适合Python初学者的一些编程技巧
2020/02/12 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
审核会计岗位职责
2013/11/08 职场文书
装潢设计专业推荐信模板
2013/11/26 职场文书
高级工程师岗位职责
2013/12/15 职场文书
老人祝寿主持词
2014/03/28 职场文书
三字经教学反思
2014/04/26 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
2014小学年度工作总结
2014/12/20 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书