浅析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列表计数及插入实例
Dec 17 Python
Python中Continue语句的用法的举例详解
May 14 Python
python操作redis的方法
Jul 07 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
python 换位密码算法的实例详解
Jul 19 Python
python装饰器实例大详解
Oct 25 Python
详解Python3 基本数据类型
Apr 19 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
解决python3输入的坑——input()
Dec 05 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
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
PHP获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
Python探索之URL Dispatcher实例详解
2017/10/28 Python
深入浅析Python中的yield关键字
2018/01/24 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
python中退出多层循环的方法
2018/11/27 Python
对pandas处理json数据的方法详解
2019/02/08 Python
Python timeit模块原理及使用方法
2020/10/10 Python
快速创建python 虚拟环境
2020/11/28 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
strlen的几种不同实现方法
2013/05/31 面试题
高中生物教学反思
2014/02/05 职场文书
社会工作专业求职信
2014/07/15 职场文书
关于颐和园的导游词
2015/01/30 职场文书
个人借条范本
2015/05/25 职场文书
Python基本数据类型之字符串str
2021/07/21 Python