python 序列化_python怎么序列化
pickle模块,json模块
(1)把变量从内存中变成可存储或传输的过程,称之为序列化。Python中叫pickling,其他语言中也被称为serialization,marshalling,flattening等,都是相同的意思。
(2)序列化之后,就可以把序列化后的内容(序列化后的内容是一个Bytes)写入磁盘,或者通过网络传输到别的机器上。
(3)把变量内容从序列化的对象重新读到内存里,称之为反序列化,即unpickling。
(4)Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用pickle保存那些不重要的数据,不能成功地反序列化也没关系。
把一个对象序列化并写入文件,有两种方法:
(1)pickle.dumps( )方法: 把任意对象序列化成一个bytes,然后,通过一定方式把这个bytes写入文件。import pickle
d=dict(name='bob',age=23,score=98)
print(pickle.dumps(d))
(2)pickle.dump( )方法: 直接把对象序列化后写入一个file-like Objectimport pickle
d=dict(name='shirley',age=23,score=98)
f=open('dump.txt','wb') #因为序列化之后是bytes,所以是wb
pickle.dump(d,f)
f.close()
#通过pickle.dump()将对象保存到文件中,通过下面语句可以查看写入的序列化内容
f=open("dump.txt",'rb')#rb
print(f.read())
pickle.dumps( )和pickle.dump( )的区别:就在于中间过程我们是否还需要再做一些操作。
前者我们还要再做一些操作;后者不需要我们再进行任何操作。
同序列化一样,当要把对象从磁盘读到内存时,有两种方法:
(1)pickle.loads( ):可以先把内容读到一个bytes,然后用pickle.loads( )方法反序列化出对象
(2)pickle.load( ):直接用pickle.load( )方法从一个file-like Object中直接反序列化出对象import pickle
f=open('dump.txt','rb')
s=pickle.load(f)
f.close()
print("反序列化后的对象s:",s)
运行结果: 反序列化后的对象s: {'score': 98, 'age': 23, 'name': 'shirley'}
注意:这个反序列化后的对象和原来的变量d是完全不相干的,它们只是内容相同而已。
JSON
Python内置的json模块可以实现从Python对象到JSON格式的转换
(1)JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。
(2)JSON是标准格式,比XML更快,而且可以直接在Web页面中读取。
(3)JSON表示的对象就是标准的JavaScript语言的对象
JSON和Python内置的数据类型对应如下:
JSON类型------Python类型
{ }----------------dict
[ ]----------------list
"string"---------str
1234.56--------int或float
true/false-------True/False
null---------------None
注: 把Python对象转换成JSON格式时,只要是上面表格中列举的Python类型即可,其他类型,例如变量,就会报错。
把Python对象转换成JSON格式:json.dumps( )方法,json.dump( )方法(可以直接把JSON写入一个file-like Object)
要把JSON反序列化为Python对象:json.loads( )方法,json.load( )方法 (前者把JSON的字符串反序列化,后者从file-like Object 中读取字符串并反序列化)
实例:把Python对象变成一个JSONimport json
d=dict(name='shirley',age=23,score=98)
print(json.dumps(d))
print(isinstance(json.dumps(d),str)) #判断序列化后的内容类型
print(type(json.dumps(d)))#判断序列化后的内容类型
运行结果:json.dumps(d): {"name": "shirley", "age": 23, "score": 98}
True
JSON字符串反序列化:import json
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str))
print(type(json.loads(json_str)))
注:由于JSON标准规定JSON编码是UTF-8,所以我们总是能正确地在Python的字符串str与JSON的字符串之间转换。
JSON进阶
由于Python的字典dict对象在上面表格列举的Python类型中,所以字典dict可以直接序列化为JSON的{ },不过,很多时候,更喜欢用class表示对象,比如定义Student类,然后序列化:import json
class Student(object):
def __init__(self,name,age,score):
self.name=name
self.age=age
self.score=score
s=Student('Nancy',24,89)
print(json.dumps(s))
运行结果:Traceback (most recent call last):
……………………………………
TypeError: is not JSON serializable
错误的原因是:
Student对象不是一个可序列化为JSON的对象。 如果class的实例对象都无法序列化为JSON,这肯定不合理。(我的理解是class的实例对象s是一个变量,不在上面列举的Python类型中,所以报错)
前面的代码之所以无法把Student类实例序列化为JSON,是因为默认情况下,dumps( )方法不知道如何将Student实例变为一个JSON的{ }对象。
解决办法是:定制JSON序列化####对可选参数default进行设置,把任意class的实例变为dictprint(json.dumps(s, default=lambda obj: obj.__dict__))
通常类class的实例都有一个dict属性,它就是一个dict,用来存储实例变量(注意:是实例变量,即不同实例,该属性存储的变量不同,互不影响)。也有少数例外,比如定义了slots
同理,把JSON反序列化为一个Student对象实例,loads( )方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例class Student(object):
def __init__(self,name,age,score):
self.name=name
self.age=age
self.score=score
import json
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str))
print(json.loads(json_str, object_hook=dict2student))
运行结果:{'age': 20, 'score': 88, 'name': 'Bob'}
打印出的是反序列化的实例对象。
小结
Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。
json模块的dumps( )和loads( )函数是定义得非常好的接口的典范。使用时只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。
python学习网,免费的在线学习python平台,欢迎关注!
python 序列化_python怎么序列化相关推荐
- pythonjson序列化_Python Json序列化与反序列化的示例
不同的编程语言有不同的数据类型; 比如说: Python的数据类型有(dict.list.string.int.float.long.bool.None) Java的数据类型有(bool.char.b ...
- python 序列化_python之序列化
什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 把字符转换成内存数据类型,叫反序列化. 为什么要序列化? 你 ...
- python建立数据库并序列化_python之数据的序列化
参考博客:http://www.cnblogs.com/yyds/p/6563608.html 数据的序列化功能表 json.dumps() 将python数据类型转换为(json)字符串 json. ...
- python建立数据库并序列化_Python之数据序列化(json、pickle、shelve)
一.python类型数据和JSON数据格式互相转换 pthon 中str类型到JSON中转为unicode类型,None转为null,dict对应object 二. 序列化/反序列化 将对象转换为可通 ...
- 解决Python自带的json序列化工具不能序列化datetime类型数据问题
解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...
- python中常用的序列化模块_使用pickle模块对python对象进行序列化
pickle模块是Python自带的一个标准模块,专用于Python各种对象的序列化和反序列化,可用于Python内置的各种数据对象(Python中一切都是对象),也可用于程序员自定义的类和对象. p ...
- python学习笔记 day20 序列化模块(二)
pickle 可以将任何数据类型转为字符串:但是pickle之后的结果也只有python可以看懂,而且反序列化依靠python代码: pickle 和 json 很像 都是有dumps loads d ...
- 一文学会Python标准库struct序列化与反序列化
使用Python标准库struct序列化Python整数.实数.字节串时,需要使用struct模块的pack()函数把对象按指定的格式进行序列化,然后使用文件对象的write()方法将序列化的结果字节 ...
- cpickle支持的python版本_Python cPickle模块(转)
持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象.通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识.另外,还会让 ...
最新文章
- 武器化道路越走越远的无人机
- golang sync.Mutex 互斥锁 使用实例
- 炎炎夏日需要一个清凉的地 - 自制水冷系统
- Linux 下修改(NTFS或fuseblk)磁盘(卷标)显示名称
- OS X下使用OpenGL做离屏渲染
- mysql中ak替换键_数据库:唯一性约束_alternate key(替换键) mySQL Oracle 数据库 ak 唯一性约束...
- mysql查看sql代价_mysql 代价
- 数据结构——平衡二叉树
- java编写设置按钮随机背景色_java – 如何设置自定义按钮状态背景颜色?
- 杨镭访谈:UCloud 的技术价值观
- 计算机应用基础南丁格尔,关于单元基础训练的习题
- Python: 第三方模块(modules)的安装位置 (2014-08-24 23:19:18)转载▼ 标签: site-packages dist-packages 默认安装目录	分类: Pyth
- 微信小程序页面跳转失效原因
- 右手螺旋判断磁感应强度方向_如何判断磁感应强度方向 方法是什么
- [MySQL 工具] pt-query-digest使用出错问题分析Can't locate Time/HiRes.pm in @INC
- 支付宝小程序支付(统一收单交易创建接口)
- win10分屏设置壁纸+获取win10锁屏壁纸
- VsCode配置快速注释
- linux vim命令pdf,Linux中vi、vim命令大全
- 线性递推数列_学习笔记
热门文章
- animate.css 使用记录
- js canvas 画图线程处理
- POI中设置(居中,字体,边框等)Excel单元格样式
- 【渝粤题库】广东开放大学 土木工程CAD 形成性考核
- 从51单片机白痴到51单片机高手的快速成长
- 重读《C primer plus》(四)
- IP机顶盒系列一,WIZNET解决方案
- 如何管理计算机的游戏,我的计算机上有一个Master Lu游戏库,无法在控制面板中找到,也找不到360软件管理. 如何卸载?...
- C语言:qsort()解析
- 如何在mac电脑终端中输入“python”来启动python