序列化的两个模块(json和pickle)
到底什么是序列化(picking)呢?
我们把变量从内存中变成可存储或传输的过程称之为序列化
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling
json和pickle
json和pickle模块,两个都是用于序列化的模块
json
#json 是通用的,可以在各种语言里进行交互,只是一个简单的序列化方法
#json把python对象转化成字符串,仅限于简单的数据类型,例如列表,字典,元组等
pickle
#pickle是python中独有的序列化模块,pickle支持序列化所有python数据类型,以二进制的方式序列化
pickle
import pickle
d=[1,2,'a','b']
print(pickle.dumps(d))
print(type(pickle.dumps(d))) #执行结果
b'\x80\x03]q\x00(K\x01K\x02X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02e.'
<class 'bytes'>
pickle模块提供了四个功能:dumps、dump、loads、load。
dumps和dump都是进行序列化,而loads和load则是反序列化。
dumps将所传入的变量的值序列化为一个bytes,然后,就可以将这个bytes写入磁盘或者进行传输。
而dump则更加一步到位,在dump中可以传入两个参数,一个为需要序列化的变量,另一个为需要写入的文件。
import pickle
info={
'name':'牛魔王',
'age':'',
'sex':'男'
}
f=open('pickle_text','wb')
f.write(pickle.dumps(info))# -->=pickle.dump(info,f)
f.close()
反序列化:loads当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用loads方法反序列化出对象,也可以直接用load方法直接反序列化一个文件。
import pickle
f=open('pickle_text','rb')
print(pickle.loads(f.read()))#pickle.loads(f.read())等同于pickle.load(f)
f.close()
json
如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
json中的方法和pickle中差不多,也是dumps,dump,loads,load。使用上也没有什么区别,区别在于,json中的序列化后格式为字符。
import json
info={
'name':'Mike',
'age':'',
'sex':'Man'
}
print(json.dumps(info)) #执行结果
{"age": "", "name": "Mike", "sex": "Man"}
dumps:
import json
info={
'name':'Mike',
'age':'',
'sex':'Man'
} f=open('json_text','w',encoding='utf-8')
f.write(json.dumps(info))
f.close()
loads:
import json
f=open('json_text','r',encoding='utf-8')
data=json.loads(f.read())
print(data['age'])
f.close()
因为python中一切事物皆对象,所有对象都是基于类创建的,所以,‘类’在python中占据了相当大的比重。我们能否将类的实例进行序列化呢?
class student(object):
def __init__(self,name,age,course):
self.name=name
self.age=age
self.course=course
a=student('Mike',24,'male')
import json
json.dumps(a) TypeError: <__main__.student object at 0x01261670> is not JSON serializable #出错了
难道真的序列化不了?
其实前面的代码之所以无法把student类实例序列化为JSON,是因为默认情况下,dumps方法不知道如何将student实例变为一个JSON的'{}'对象。
我们需要’告诉‘json模块如何转换。
class student(object):
def __init__(self,name,age,course):
self.name=name
self.age=age
self.course=course
a=student('Mike',24,'male') def st_to_dict(a):
return {'name': a.name, 'age': a.age, 'course': a.course} import json
print(json.dumps(a, default=st_to_dict)) # default参数就是告知json如何进行序列化 #执行结果
{"name": "Mike", "age": 24, "course": "male"}
当然,如果我们每定义一个类,还得再定义一下这个类的实例转换为字典的函数实在是太麻烦了!!我们有一个一劳永逸的办法。
print(json.dumps(a, default=lambda obj: obj.__dict__)) #执行结果
{"age": 24, "name": "Mike", "course": "male"}
其中的__dict__不需我们在类中定义,因为通常class的实例都有一个__dict__属性,它就是一个字典,用来存储实例变量。
print(a.__dict__) #执行结果
{'age': 24, 'name': 'Mike', 'course': 'male'}
序列化的两个模块(json和pickle)的更多相关文章
- 常用文件操作模块json,pickle、shelve和XML
一.json 和 pickle模块 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Js ...
- 模块 json 和 pickle
目录 序列化 json 和 pickle 模块 序列化 序列:字符串 序列化:将其它数据类型转换成字符串的过程. 反序列化:字符串转成其它数据类型. 序列化的目的 1:以某种存储形式使用自定义对象持久 ...
- 20,序列化模块 json,pickle,shelve
序列化模块 什么叫序列化? 将原本的字典,列表等内容转换成一个字符串的过程叫做序列化. 序列化的目的? 数据结构 通过序列化 转成 str. str 通过反序列化 转化成数据结构. json: jso ...
- day5 常用模块json和pickle
json 和 pickle json和pickle是用于字符串序列化和反序列化的过程,我们在存储和使用的时候,经常把列表存入文件,读取的时候我们还想以列表的形式读取.就需要使用json和pickle. ...
- 2019-7-18 collections,time,random,os,sys,序列化模块(json和pickle)应用
一.collections模块 1.具名元组:namedtuple(生成可以使用名字来访问元素的tuple) 表示坐标点x为1 y为2的坐标 注意:第二个参数可以传可迭代对象,也可以传字符串,但是字 ...
- python序列化模块json和pickle
序列化相关 1. json 应用场景: json模块主要用于处理json格式的数据,可以将json格式的数据转化为python的字典,便于python处理,同时也可以将python的字典或列表等对象转 ...
- python中序列化模块json和pickle
json模块:json是第三方包,不是系统内置模块,以字符串序列 常用操作有: json.dumps() # 将变量序列化,即将功能性字符转化为字符串 例: >>> import j ...
- 常用模块一(os模块、序列化模块(json和pickle))
一.os模块 os模块是与操作系统交互的一个接口. import os # 和文件和文件夹的操作有关 os.makedirs('dirname1/dirname2') # 可生成多层递归目录 os.r ...
- python模块-json、pickle、shelve
json模块 用于文件处理时其他数据类型与js字符串之间转换.在将其他数据类型转换为js字符串时(dump方法),首先将前者内部所有的单引号变为双引号,再整体加上引号(单或双)转换为js字符串:再使用 ...
随机推荐
- android studio - 隐藏编辑器上面的竖线
android studio 的代码编辑器上面默认有一条竖线不知道是干什么用的,很难看.可以用下列方法进行隐藏. 取消选中这个复选框即可.
- python C example:encode mp3 code
#include <stdio.h> #include <stdlib.h> #include <lame.h> #define INBUFSIZE 4096 #d ...
- CronTrigger中cron表达式使用
1.定时任务,当执行是具体时间的时候,不会立即执行,而是到指定时间执行. 2.实现Job接口时候,类中要有无参的public构造方法. 3.表达式中共用七个字段,按顺序是秒.分.时.日.月.周.年,默 ...
- Office Web Apps Server 2013与PDF(一)
好吧--这个消息有点旧,迟了将近4个月. Office Web Apps是微软各大服务产品系列中的一个基础服务,可以为SharePoint 2013.Exchange 2013.Lync 2013提供 ...
- spark集群模式
1.配置集群主机免登陆,参考http://www.cnblogs.com/puroc/p/5996730.html2.修改/etc/hosts文件,增加所有主机名和IP的对应关系 3.修改spark- ...
- HTTPS请求 SSL证书验证
import urllib2 url = "https://www.12306.cn/mormhweb/" headers = {"User-Agent": & ...
- 添加可点击的imagebottom,有个点击动画效果
android添加可点击的按钮,有个动画切换 ,首先定义一个 res/drawable中定义一个 btn_shutter_background.xml,其定义举例如下: <?xml versio ...
- ios - 视图 渐变
// // YViewGradient.m // AoleYou20170907 // // Created by XY IOS on 2018/4/25. // Copyright © 2018年 ...
- Python 基础函数
函数: 在程序设计中,函数是指用于进行某种计算的一系列语句的有名称的组合. 定义一个函数时,需要指定函数的名称并写下一系列程序语句.定义时不会执行,运行代码时,先加载进内存中,之后使用名称来调用这个函 ...
- Linux 并发服务器雏形总结
如下介绍一个并发回射客户端/服务器的雏形,所谓回射:就是客户端输入一条数据,服务器端读取并显示,然后服务器端再把刚读取的信息发送回客户端进行显示.示意图如下: 所谓并发服务器:就是一个服务器可以同时为 ...