实例讲解python中的序列化知识点


Posted in Python onOctober 08, 2018

在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:

d = dict(name='Bob', age=20, score=88)

可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'。

我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

Python提供了pickle模块来实现序列化。

首先,我们尝试把一个对象序列化并写入文件:

>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'

pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:

>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()

看看写入的dump.txt文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。

当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用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更加轻松。

Python 相关文章推荐
python搭建简易服务器分析与实现
Dec 15 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
TensorFlow saver指定变量的存取
Mar 10 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
Feb 19 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 Python
python语言中pandas字符串分割str.split()函数
Aug 05 Python
使用python生成大量数据写入es数据库并查询操作(2)
Sep 23 Python
实例讲解python中的协程
Oct 08 #Python
详解python分布式进程
Oct 08 #Python
python中多个装饰器的执行顺序详解
Oct 08 #Python
使用EduBlock轻松学习Python编程
Oct 08 #Python
Django forms组件的使用教程
Oct 08 #Python
详解关于Django中ORM数据库迁移的配置
Oct 08 #Python
面向初学者的Python编辑器Mu
Oct 08 #Python
You might like
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
php 随机生成10位字符代码
2009/03/26 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
js同时按下两个方向键
2007/12/01 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
JS常用知识点整理
2017/01/21 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
微信小程序嵌入腾讯视频源过程详解
2019/08/08 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
简单介绍python封装的基本知识
2019/08/10 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
校园安全检查制度
2014/02/03 职场文书
验房委托书
2014/08/30 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
大学生受助感言
2015/08/01 职场文书
PYTHON InceptionV3模型的复现详解
2022/05/06 Python