浅析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基于PycURL实现POST的方法
Jul 25 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
python 查找文件名包含指定字符串的方法
Jun 05 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
Aug 10 Python
利用python Selenium实现自动登陆京东签到领金币功能
Oct 31 Python
Python多线程多进程实例对比解析
Mar 12 Python
django-利用session机制实现唯一登录的例子
Mar 16 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
Pycharm常用快捷键总结及配置方法
Nov 14 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 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
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
2017/03/07 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
python使用 HTMLTestRunner.py生成测试报告
2017/10/20 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
python如何将图片转换素描画
2020/09/08 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
革命先烈的英雄事迹材料
2014/02/15 职场文书
毕业生自荐信如何写
2014/03/24 职场文书
任命书范本大全
2014/06/06 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
北京故宫的导游词
2015/01/31 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
详解Python函数print用法
2021/06/18 Python