浅析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快速查找算法应用实例
Sep 26 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
浅谈python常用程序算法
Mar 22 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
什么是Python中的顺序表
Jun 02 Python
Python Request类源码实现方法及原理解析
Aug 17 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
Jan 13 Python
python中scipy.stats产生随机数实例讲解
Feb 19 Python
详细介绍python类及类的用法
May 31 Python
pandas数值排序的实现实例
Jul 25 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调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
php数据序列化测试实例详解
2017/08/12 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
浅析python 中__name__ = '__main__' 的作用
2014/07/05 Python
Python numpy 点数组去重的实例
2018/04/18 Python
python中的二维列表实例详解
2018/06/19 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
AmazeUI折叠式卡片布局,整合内容列表、表格组件实现
2020/08/20 HTML / CSS
给领导的致歉信范文
2014/01/13 职场文书
信息技术课后反思
2014/04/27 职场文书
经典毕业生求职信
2014/07/12 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python