Python序列化-pickle和json模块
Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。
程序运行时,所有的变量都保存在内存中,程序结束后,内存回收,没有保存的变量还是原样的。
所以想要持久化变量,就需要从内存中读取,保存到磁盘上,这个过程称作序列化-pickling
反之,从磁盘读取为对象,称为反序列化-unpickling
pickle
Python提供的pickle模块很简单的将对象序列化为二进制类型,再进行二进制到文件的写入;
或者直接点的,直接将对象序列化后写入file-like-object
1.对象序列化为二进制,pickle.dumps()方法直接操作对象
import pickle mylist = [1,3,5,'ac'] ban = pickle.dumps(mylist)
>>>ban
b'\x80\x03]q\x00(K\x01K\x03K\x05X\x02\x00\x00\x00acq\x01e.' #这里得到一个二进制数据类型
1.1.pickle反序列化,pickle.loads(),主义这里loads()方法读取的是二进制数据
>>>pickle.loads(mylist)
[1,3,5,'ac']
2.对象直接序列化为文件对象和反序列化;object--->>>file-like-object
序列化,pickle.dump()方法
import pickle mylist = [1,2,3,'abc']
f = open('mylist.txt','wb')#以二进制写入
pickle.dump(mylist,f)
f.close()#文件操作完成后关闭,否则造成无法读写报错EOFError: Ran out of input
反序列化,pickle.load()方法
JSON
如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
JSON类型 Python类型
{} dict
[] list
"str" str
123 int或float
ture/false Ture/False
null None
使用json需要导入json模块,JSON标准规定JSON编码是UTF-8,所以我们总是能正确地在Python的str与JSON的字符串之间转换。
序列化和反序列化完全和pickle一致
序列化为file-like-object,json.dump()方法
import json mylist = [1,2,3,'abc']
f = open('mylist.txt','wb')#以二进制写入
json.dunmp(mylist,f)
f.close()#文件操作完成后关闭,否则造成无法读写报错EOFError: Ran out of input
file-like-object反序列化,json.load()方法
f = open('mylist.txt','rb') #二进制打开
>>>json.load(f)
[1,2,3,'abc']
>>>f.close()
类对象的序列化
import json class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age s = Student('tom',20)
>>>json.dump(s)
TypeError: <__main__.Student object at 0x10603cc50> is not JSON serializable 报错类型错误,json不可将实例Student序列化
dumps()可以提供很多参数
json.dumps(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
default参数可以增加一个函数,将Student对象转化为一个dict,dict是可以序列化的
def todict(stu):
return{
'name':stu.name,
'age':stu.age
}
default参数为函数
import json class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age s = Student('tom',20)
>>>json.dump(s,default=todict)
{'name','tom','age':20}
或者快捷方式,
import json class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score s = Student('tom', 20, 88) print(json.dumps(s,default=lambda obj:obj.__dict__))
{'name':'tom','age':20,'score':88}
因为通常class的实例都有一个__dict__属性,它就是一个dict,用来存储实例变量。也有少数例外,比如定义了__slots__的class。
__slots__ = (),这个方法用来限制实例的属性,作用域仅限当前的类,当父类中有__slots__属性时,子类中并没有限制,当子类中定义__slots__时,子类的实例限制就是子类本身加上父类的__slots__。
反序列化
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
json.loads()方法也object_hook提供函数参数,用来反序列化
import json class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score s = Student('Bob', 20, 88) jsonstr = json.dumps(s,default=lambda obj:obj.__dict__) print(jsonstr) def dicttoobj(d):
return Student(d['name'],d['age'],d['score']) print(json.loads(jsonstr,object_hook=dicttoobj))
{"name": "Bob", "age": 20, "score": 88}
<__main__.Student object at 0x000002518657C8D0>
得到Student对象
Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。
Python序列化-pickle和json模块的更多相关文章
- python 序列化 pickle shelve json configparser
1. 什么是序列化 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称 ...
- Python开发之序列化与反序列化:pickle、json模块使用详解
1 引言 在日常开发中,所有的对象都是存储在内存当中,尤其是像python这样的坚持一切接对象的高级程序设计语言,一旦关机,在写在内存中的数据都将不复存在.另一方面,存储在内存够中的对象由于编程语言. ...
- Python中的序列化以及pickle和json模块介绍
Python中的序列化指的是在程序运行期间,变量都是在内存中保存着的,如果我们想保留一些运行中的变量值,就可以使用序列化操作把变量内容从内存保存到磁盘中,在Python中这个操作叫pickling,等 ...
- Python 序列化 pickle/cPickle模块
Python 序列化 pickle/cPickle模块 2013-10-17 Posted by yeho Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给 ...
- Python学习笔记:json模块和pickle模块(数据序列化)
Python中的json模块和pickle都是用于数据的序列化和反序列化,它们提供的方法也是一样的:dumps,dump,loads,load dumps(obj):将对象序列化为str. dump( ...
- Python 常用模块(2) 序列化(pickle,shelve,json,configpaser)
主要内容: 一. 序列化概述 二. pickle模块 三. shelve模块 四. json模块(重点!) 五. configpaser模块 一. 序列化概述1. 序列化: 将字典,列表等内容转换成一 ...
- 各类模块的粗略总结(time,re,os,sys,序列化,pickle,shelve.#!json )
***collections 扩展数据类型*** ***re 正则相关操作 正则 匹配字符串*** ***time 时间相关 三种格式:时间戳,格式化时间(字符串),时间元组(结构化时间).***`` ...
- Python 序列化pickle/cPickle模块整理
Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁.很多游戏允许你在退出的时候保存进度,然后你再 ...
- pickle和json模块
json模块 json模块是实现序列化和反序列化的,主要用户不同程序之间的数据交换,首先来看一下: dumps()序列化 import json '''json模块是实现序列化和反序列话功能的''' ...
随机推荐
- Nginx教程---01.Nginx入门
create by 三七二十一 LZ参考视频(年代久远,但万变不离其宗): 链接:https://pan.baidu.com/s/1O_MmN0c3ckM6vbk08n8Qkg 密码:z9zr 01_ ...
- WebSocket 教程
转载自:http://www.ruanyifeng.com/blog/2017/05/websocket.html WebSocket 是一种网络通信协议,很多高级功能都需要它. 本文介绍 WebSo ...
- pymongo.errors.OperationFailure: Authentication failed.
mongoDB有不同的认证机制,3.0版本以后采用的是'MONGODB-CR', 之前的版本采用的是'MONGODB-CR'. 所以,以我的版本情况,显然应该用'SCRAM-SHA-1' from p ...
- 配置多个版本的jdk
引言: 由于公司有多个项目都需要我开发,而各个项目所依赖的jdk版本又不同,因此需要配置多个jdk; 配置方法: 什么也不说了,直接上图: 然后在其他需要制定Tomcat的地方直接引用JAVA_HOM ...
- react面试问题总结
1. 在生命周期中的哪一步你应该发起 AJAX 请求? 我们应当将AJAX 请求放到 componentDidMount 函数中执行,主要原因有下: 放到componentWillMount不好. ...
- 如何备份MySQL数据库
在MySQL中进行数据备份的方法有两种: 1. mysqlhotcopy 这个命令会在拷贝文件之前会把表锁住,并把数据同步到数据文件中,以避免拷贝到不完整的数据文件,是最安全快捷的备份方法. 命令的使 ...
- 力扣(LeetCode)125. 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a c ...
- PostCSS以及cssnext语法
什么是postcss postcss 一种对css编译的工具,类似babel对js的处理,常见的功能如: 1 . 使用下一代css语法 2 . 自动补全浏览器前缀 3 . 自动把px代为转换成 rem ...
- 全排列问题Ⅰ(Java实现)
给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1 ...
- Jmeter 接口测试知识梳理——持续集成篇
Jmeter 使用也有很长时间了,但是一直没有做一下知识梳理,近期会对公司同事做一下这方面的培训,借此机会,把使用过程中应用到的知识,或是遇到的问题,整理出来,方便大家学习! Jmeter + Ant ...