浅析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写的图片蜘蛛人代码
Aug 27 Python
Python按行读取文件的简单实现方法
Jun 22 Python
Python中的sort()方法使用基础教程
Jan 08 Python
python安装twisted的问题解析
Aug 21 Python
python清除字符串前后空格函数的方法
Oct 21 Python
详解Python中pandas的安装操作说明(傻瓜版)
Apr 08 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
Python  Django 母版和继承解析
Aug 09 Python
python基于TCP实现的文件下载器功能案例
Dec 10 Python
Python requests及aiohttp速度对比代码实例
Jul 16 Python
python3读取文件指定行的三种方法
May 24 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获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
PHP读取Excel类文件
2017/05/15 PHP
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
javascript简单实现命名空间效果
2014/03/06 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
Python连接SQLServer2000的方法详解
2017/04/19 Python
python实现二叉查找树实例代码
2018/02/08 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
Python如何在DataFrame增加数值
2020/02/14 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
产品促销活动策划书
2014/01/15 职场文书
中学家长会邀请函
2014/01/17 职场文书
新任教师自我鉴定
2014/02/24 职场文书
文艺晚会主持词
2014/03/24 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
法学求职信
2014/06/22 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
自荐信模板大全
2015/03/27 职场文书
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL