浅析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 04 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
python顺序执行多个py文件的方法
Jun 29 Python
Python3+Appium安装使用教程
Jul 05 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
Sep 10 Python
tensorflow转换ckpt为savermodel模型的实现
May 25 Python
pandas.DataFrame.drop_duplicates 用法介绍
Jul 06 Python
pycharm2021激活码使用教程(永久激活亲测可用)
Mar 30 Python
教你怎么用Python操作MySql数据库
May 31 Python
用Python编写简单的gRPC服务的详细过程
Jul 04 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
PHP实现微信退款功能
2018/10/02 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
jquery each的几种常用的使用方法示例
2014/01/21 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
javascript计时器详解
2015/02/28 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
快速掌握jQuery插件WebUploader文件上传
2016/11/07 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
requests和lxml实现爬虫的方法
2017/06/11 Python
Python反转序列的方法实例分析
2018/03/21 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
装饰资料员岗位职责
2013/12/30 职场文书
自我管理的活动方案
2014/08/25 职场文书
思想作风建设心得体会
2014/10/22 职场文书
求职信格式范文
2015/03/19 职场文书
Redis Stream类型的使用详解
2021/11/11 Redis