廖雪峰Python学习笔记——序列化
序列化
定义:程序运行时所有变量都存在内存中,把变量从内存中变成可存储或可传输的过程称为序列化pickling,在其他语言中称为serialization,marshalling,flattening等等,都是一个意思。
作用:序列化后可把序列化的内容存到磁盘,或者通过网络传输到其他机器上。
实现方式:cPickle和pickle,前者是c语言写的速度更快。
#用pickle.dumps()把任意对象序列化成一个str
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.dump(d,f)d = dict(name ='Bob',age=23, score=90)
f = open('py.txt','wb’)#在当前目录下新建了一个py.txt文件并将用wb方式处理文件
pickle.dump(d,f)
f.close()
反序列化unplickling:把序列化之后的内容重新读入内存中。
#如果是用一个str保存之前序列化后的内容,则用pickle.loads(str)得到反序列化后的内容:
d = dict(name='Bob',age=20,score = 90)
pd = pickle.dumps(d)
upd = pickle.loads(pd)
print upd
#如果用的是文件保存序列化后的内容,用pickle.load()反序列化
f =open('py.txt','rb')
d = pickle.load(f)
f.close()
print d
注意:pickle后的结果只能用于python且与py的版本有关,否则不兼容。所以pickle只能用到不重要的内容上。
JSON
定义:序列化的一种标准格式。python也内置了json模块。
作用:如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。
#用json.dumps()把python对象序列化为json格式的str
import json
d = dict(name='Jane',age=23,score=90)
js = json.dumps(d)
print js
#用json.dump()把python对象标准序列化到指定文件
d = dict(name='Jane',age=23,score=90)
f = open('py.txt','wb')
json.dump(d,f)
f.close()
#用json.loads()和json.load()将json格式的内容反序列化
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
u'age'20u'score'88u'name'u'Bob’格式默认utf-8编码
将类序列化为json与反序列化
#将定义一个dict的类序列化为json格式的str
import json
class Student(object):
def __init__(self,name,age,score):
self.name = name
self.age = age
self.score = score
s = Student('Jane',20,90)
def class2dict(inst):
return {
'name':inst.name,
'age':inst.age,
'score':inst.score
}
sjson = json.dumps(s,default=class2dict)#这时s先化为dict再被序列化为json
print sjson
#更简洁通用地让类实例序列化为dict
json.dumps(t,default=lambda obj:obj.__dict__)
#使用lambda时直接用一个语句定义函数+得到返回值
#每个类都有一个__dict__方法,用来储存各实例变量,除了一些定义了__slots__的class
#将json格式的类的实例反序列化为dict
import json
class Stu(object):
def __init__(self,name,age,score):
self.name = name
self.age=age
self.score=score
def dict2inst(i):
return Stu(i['name'],i['age'],i['score'])
json_dict = '{"score":90,"age":20,"name":"Jane"}'
print json.loads(json_dict,object_hook=dict2inst)
#先将dict转化为实例,再反序列化
廖雪峰Python学习笔记——序列化的更多相关文章
- 廖雪峰Python学习笔记——类和实例
Class MyList(list): __metaclass__ = ListMetaclass #它表示在创建MyList这个类时,必须通过 ListMetaclass这个元类的LIstMetac ...
- 廖雪峰Python学习笔记——使用元类
元类(MetaClasses) 元类提供了一个改变Python类行为的有效方式. 元类的定义是“一个类的类”.任何实例是它自己的类都是元类. class demo(object): pass obj ...
- python学习笔记 序列化
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把name改成'Bill',但 ...
- 廖雪峰 JavaScript 学习笔记(字符串、数组和对象)
字符串 1.和python一样,也是用' '或" "括起来的字符表示.但多行字符串是用反引号(esc下键)``,与之相对的是Python用''' '''三引号表示: 2.转义字符: ...
- 廖大大python学习笔记1
列表classmates = ['Michael', 'Bob', 'Tracy']classmates.append('tom')print classmates# classmates.inser ...
- 《Git教程-廖雪峰》学习笔记
一.创建版本库 ①初始化一个Git仓库:git init ②添加文件到Git仓库:1.git add<file> ; 2.git commit 二.时光机穿梭 ①查看工作区状态,文件是否 ...
- 廖雪峰 JavaScript 学习笔记(函数)
JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述abs()函 ...
- 廖雪峰 JavaScript 学习笔记(判断、循环)
条件判断 固定格式:if () { ... } else { ... } ,else可选 1.多行条件判断,通常把else if连写在一起,来增加可读性 例子: var age = 3; if (a ...
- 廖雪峰JavaScript学习笔记(基础及数据类型、变量)
先睹为快 alert('我要学JavaScript!'); Run: 基本语法: 1.每个语句以;结束,不强制 2.语句块用{...} 3.//单行注释,/*...*/ 多行注释 数据类型: 1.不区 ...
随机推荐
- Paxos Made Simple
Paxos一致性算法——分布式系统中的经典算法,论文本身也有一段有趣的故事.一致性问题是分布式系统的根本问题之一,在论文中,作者一步步的加强最初一致性问题(2.1节提出的问题)的约束条件,最终导出了一 ...
- 3D文件压缩库——Draco简析
3D文件压缩库——Draco简析 今年1月份时,google发布了名为“Draco”的3D图形开源压缩库,下载了其代码来看了下,感觉虽然暂时用不到,但还是有前途的,故简单做下分析. 注:Draco 代 ...
- 移动端bug之解决方式
1.Android中元素被点击时产生的边框: * { -webkit-tap-highlight-color: rgba(250,250,250,0); /*更改点击事件的焦点色*/} 2.去除移 ...
- NOIP 2016 游记
- [远程] windows 2008 server设置了共享文件夹,并且共享给了everyone,但是还是无法访问,怎么解决呢?
还需要设置另外一个地方,将用户加到MSAppAccess这个组里去
- 原型工具之团队协作: Axure VS Mockplus
一款软件产品的诞生,必然会经历一个过程:需求分析.设计.开发.测试.上线.如此反复迭代.而设计阶段中,原型设计.制作.交流.审核.迭代,是软件设计和开发的重要保障. 简单的一段话,我们可以解读出很多隐 ...
- jQuery 插件使用记录
Validate 表单验证 ver 1.6 浏览更多 默认情况下,当表单 submit 时,那些验证不通过的 field 旁边会出现错误消息提示,有时很方便,但有时看起来很不美观.可以关闭此消息提示. ...
- NSNotificationCenter 注意
成对出现 意思很简单,NSNotificationCenter消息的接受线程是基于发送消息的线程的.也就是同步的,因此,有时候,你发送的消息可能不在主线程,而大家都知道操作UI必须在主线程,不然会出现 ...
- 二进制搭建kubernetes多master集群【一、使用TLS证书搭建etcd集群】
上一篇我们介绍了kubernetes集群架构以及系统参数配置,参考:二进制搭建kubernetes多master集群[开篇.集群环境和功能介绍] 下面本文etcd集群才用三台centos7.5搭建完成 ...
- 2018.07.08 hdu1394 Minimum Inversion Number(线段树)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...