浅析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的Flask框架中验证注册用户的Email的方法
Sep 02 Python
Python工程师面试题 与Python基础语法相关
Jan 14 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 Python
Python反转序列的方法实例分析
Mar 21 Python
python3+PyQt5泛型委托详解
Apr 24 Python
python计算日期之间的放假日期
Jun 05 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
Python 等分切分数据及规则命名的实例代码
Aug 16 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
python爬取网易云音乐热歌榜实例代码
Aug 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
解析PHP无限级分类方法及代码
2013/06/21 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
在Vue里如何把网页的数据导出到Excel的方法
2020/09/30 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
windows下Virtualenvwrapper安装教程
2017/12/13 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
python实现textrank关键词提取
2018/06/22 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
Python执行时间的几种计算方法
2020/07/31 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
中英文自我评价语句
2013/12/20 职场文书
住房公积金接收函
2014/01/09 职场文书
学年自我鉴定
2014/01/16 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
教师个人教学反思
2016/02/23 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL
Python OpenCV之常用滤波器使用详解
2022/04/07 Python
python区块链持久化和命令行接口实现简版
2022/05/25 Python