目录
序列化
json模块
pickle模块
详解
序列化
数据分类:
结构化数据:数据之间有引用关系,如字典、列表。
线性数据(流数据):数据之间没有引用关系,如字节、字符串。
序列化:将内存中的结构化数据,转换成线性数据(字节或字符串),用以保存在文件或通过网络传输,这个转换过程称为序列化过程(数据拆分)。
反序列化:从文件中或网络中获取的数据(字节或字符串),转换成内存中原来的数据类型,这个转换过程称为反序列化过程(数据组装)。
序列化存在的原因:
数据存储在文件中,是以字节形式存储的,文件读写的open函数内部已经将字符串转换成字节,所以可以使用字符串类型的数据,其他数据类型要先转换成字符串类型,就可以用于文件读写了;
数据通过网络传输,是以字节形式传输的,只有字符串和字节可以相互转换,其他数据类型要先转换成字符串类型,再转换为字节,就可以用于网络传输了。
能实现序列化的模块:
1.json模块
不是所有的数据类型都可以序列化,序列化的结果是字符串;
不能多次对同一个文件序列化;
json数据可以跨语言。
2.pickle模块
所有python类型都能序列化,序列化的结果是字节;
可以多次对同一个文件序列化;
不能跨语言,只能在python中使用。
json模块
json(JavaScriptObjectNotation)java脚本兑现标记语言,是不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。
json模块是将部分结构化数据dict,list,tuple,str,int,float,True,False,None转换成字符串(字节的上一层),用于存储或网络传输(序列化的不够彻底,但是简单易用),并且也可以反序列化还原回去。
json模块的方法:
用于网络传输:dumps、loads
用于文件写读:dump、load
序列化
json.dumps(obj):
序列化到内存中(用于网络传输)
importjson#列表res1=json.dumps([1,2,3])#把指定的对象转换成json格式的字符串print(res1,type(res1))#[1,2,3]classstr#元组:可以进行json序列化,但是序列化后就变成了列表res2=json.dumps((1,2,3))print(res2,type(res2))#[1,2,3]classstr#数字res3=json.dumps(10)print(res3,type(res3))#10classstr#字典res4=json.dumps({name:pamela})print(res4,type(res4))#{"name":"pamela"}classstr#json转换完的字符串类型的字典中的字符串是由双引号""表示的#集合:不能进行json序列化,执行会报错res5=json.dumps(set(abc))#TypeError:ObjectoftypesetisnotJSONserializable
(左右滑动查看完整代码)
json.dump(obj,f):
序列化到文件中(用于文件写入)
importjsonwithopen(a.txt,a,encoding=utf-8)asf:json.dump([1,2,3],f)#dump方法接收一个文件句柄,直接将转换成的json字符串写入文件
(左右滑动查看完整代码)
反序列化
json.loads(s):
从内存中反序列化(用于网络接收)
importjson#列表s1=json.dumps([1,2,3])l1=json.loads(s1)print(l1,type(l1))#[1,2,3]classlist#元组:经过序列化,反序列化,会变成列表s2=json.dumps((1,2,3))l2=json.loads(s2)print(l2,type(l2))#[1,2,3]classlist#字典:要用json的loads方法处理的字符串类型的字典中的字符串必须由双引号""表示s3=json.dumps({name:pamela})l3=json.loads(s3)print(l3,type(l3))#{name:pamela}classdict
(左右滑动查看完整代码)
json.load(f):
从文件中反序列化(用于文件读取)
importjson#文件写入withopen(a.txt,a,encoding=utf-8)asf:json.dump([1,2,3],f)#文件读取withopen(a.txt,r,encoding=utf-8)asf:res=json.load(f)#load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回print(res,type(res))#[1,2,3]classlist
(左右滑动查看完整代码)
json模块对于文件写读,通常是一次性写、一次性读,json模块不会多次写、多次读。
可以使用另一种方式实现多次写、多次读:
把需要序列化的对象,通过多次序列化的方式,用文件的write方法,把多次序列化后的字符串写到文件中。
importjson#用文件的write方法,多次写入序列化后的字符串withopen(json.txt,a,encoding=utf-8)asf:f.write(json.dumps([1,2,3])+\n)f.write(json.dumps([4,5,6])+\n)#用文件的读取方法,把分次序列化的json字符串,多次反序列化回来withopen(json.txt,r,encoding=utf-8)asf:forlineinf:res=json.loads(line)print(res)
(左右滑动查看完整代码)
json的格式化输出
参数说明:sort_keys:是否按首字母进行排序indent:一个非负的整型数据,0是顶格分行显示,如果为空就是一行最紧凑显示,否则会换行且按照indent的数值显示前面的空白分行显示ensure_ascii:值为True时,所有非ASCII码字符(中文)会显示为\uXXXX序列;值为False时,非ASCII码字符(中文)会正常显示separators:分隔符,实际上是(item_separator,dict_separator)的一个元组,默认(‘,’,’:’),表示dictionary内keys之间用“,”隔开,而key和value之间用“:”隔开Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型,设置为False时,就会报TypeError的错误,设置成True,则会跳过这类key
(左右滑动查看完整内容)
importjsondata={username:[pamela,apple],sex:female,age:18}json_dic=json.dumps(data,sort_keys=True,indent=2,separators=(,,:),ensure_ascii=False)print(json_dic)执行结果:{"age":18,"sex":"female","username":["pamela","apple"]}
(左右滑动查看完整代码)
pickle模块
pickle模块是将python中所有的数据类型(包括实例化对象)转换成字节,用于存储或网络传输(序列化的够彻底),并且也可以反序列化还原回去。
pickle模块的方法:
用于网络传输:dumps、loads
用于文件写读:dump、load
序列化
pickle.dumps(obj):
序列化到内存中(用于网络传输)
importpickle#列表bys1=pickle.dumps([1,2,3])print(bys1,type(bys1))#b\x80\x03]q\x00(K\x01K\x02K\x03e.classbytes#元组bys2=pickle.dumps((1,2,3))print(bys2,type(bys2))#b\x80\x03K\x01K\x02K\x03\x87q\x00.classbytes#集合bys3=pickle.dumps(set(abc))print(bys3,type(bys3))#b\x80\x03cbuiltins\nset\nq\x00]q\x01(X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03X\x01\x00\x00\x00aq\x04e\x85q\x05Rq\x06.classbytes
(左右滑动查看完整代码)
pickle.dump(obj,f):
序列化到文件中(用于文件写入)
importpicklewithopen(a.txt,ab)asf:pickle.dump([1,2,3],f)#将pickle序列化内容写入文件中
(左右滑动查看完整代码)
反序列化
pickle.loads(s):
从内存中反序列化(用于网络接收)
importpickle#列表bys1=pickle.dumps([1,2,3])res1=pickle.loads(bys1)print(res1,type(res1))#[1,2,3]classlist#元组bys2=pickle.dumps((1,2,3))res2=pickle.loads(bys2)print(res2,type(res2))#(1,2,3)classtuple#集合bys3=pickle.dumps(set(abc))res3=pickle.loads(bys3)print(res3,type(res3))#{b,c,a}classset
(左右滑动查看完整代码)
pickle.load(f):
从文件中反序列化(用于文件读取)
importpickle#文件写入withopen(a.txt,ab)asf:pickle.dump([1,2,3],f)#文件读取withopen(a.txt,rb)asf:res=pickle.load(f)print(res,type(res))#[1,2,3]classlist
(左右滑动查看完整代码)
pickle模块对于文件写读,可以多次写、多次读
importpickle#文件写入:pickle模块可以多次读withopen(a.txt,ab)asf:pickle.dump([1,2,3],f)pickle.dump([1,2,3],f)pickle.dump([1,2,3],f)#文件读取:pickle模块可以多次读withopen(a.txt,rb)asf:whileTrue:try:print(pickle.load(f))#dump多少次,就能load多少次exceptEOFError:break
(左右滑动查看完整代码)
pickle模块对于文件写读的常用场景,和json一样,是一次性写入,一次性读取。
pickle序列化对象
importpickledeffunc():print(1)#序列化ret=pickle.dumps(func)print(ret,type(ret))#b\x80\x03c__main__\nfunc\nq\x00.classbytes#反序列化f=pickle.loads(ret)#f得到func函数的内存地址f()#执行func函数
(左右滑动查看完整代码)
预览时标签不可点收录于话题#个上一篇下一篇