浅析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 自动补全(vim)
Nov 30 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
Python3处理HTTP请求的实例
May 10 Python
如何利用Boost.Python实现Python C/C++混合编程详解
Nov 08 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
python DataFrame 取差集实例
Jan 30 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
Aug 09 Python
python实现人机五子棋
Mar 25 Python
解决Python spyder显示不全df列和行的问题
Apr 20 Python
基于Keras的格式化输出Loss实现方式
Jun 17 Python
Python文件操作及内置函数flush原理解析
Oct 13 Python
pycharm永久激活超详细教程
Oct 29 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
第四节--构造函数和析构函数
2006/11/16 PHP
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
php中常用的预定义变量小结
2012/05/09 PHP
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
python使用RNN实现文本分类
2018/05/24 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
历史专业个人求职信分享
2013/12/20 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
采购员的工作职责
2013/12/26 职场文书
七年级英语教学反思
2014/01/15 职场文书
家教广告词
2014/03/19 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
实现GO语言对数组切片去重
2022/04/20 Golang