Python中序列化与反序列化的区别有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态(存在内存中)写入到临时或持久性存储区(硬盘)。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
实现对象的序列化和反序列化在Python中有两种方式:json和泡菜。
其中json用于字符串和Python数据类型间进行转换,泡菜用于Python特有的类型和Python的数据类型间进行转换,泡菜是Python特有的。
<强> 1,json序列化:json.dumps() 强>
信息 “name":“tj" “age": 22 } 进口json 打印(信息) print(类型(信息)) print (json.dumps(信息)) print(类型(json.dumps(信息))) 开放(f=皌est.txt",“w") # f.write(信息)# TypeError:写()参数必须str,不是东西 f.write (json.dumps(信息))#正常写入文件f.write (json.dumps(信息))等价于json。转储(信息,f) f.close () 在在在 {& # 39;名字# 39;:& # 39;tj # 39;, & # 39;年龄# 39;:22} & lt;类& # 39;dict # 39;比; {“name":“tj",“age": 22} & lt;类& # 39;str # 39;在
<强> 2,JSON反序列化:json.loads() 强>
f=open (“test.txt",“r") #打印(f.read () [“age"]) # TypeError:字符串索引必须是整数 data=https://www.yisu.com/zixun/json.loads (f.read ()) # data=json.loads (f.read())等价于data=json.load (f) 打印(数据(“年龄”)) f.close ()>> 22日
注意:对于以下这种情况json就不能处理了
进口json def你好(名称): 打印(“你好,“,名称) 信息={ “name":“tj" “age": 22日 “func":你好 } 开放(f=皌est2.txt",“w") f.write (json.dumps(信息))# TypeError:函数类型的对象不是JSON序列化 f.close ()
所以:json用于字符串和python数据类型间进行转换
<强> 3,泡菜序列化:pickle.dumps() 强>
进口泡菜 def你好(名称): 打印(“你好,“,名称) 信息={ “name":“tj" “age": 22日 “func":你好 } print (pickle.dumps(信息))#可见泡菜序列化的结果输出为二进制,所以应使用wb的方式往文件中写 开放(f=皌est2.txt",“wb") f.write (pickle.dumps(信息))#等价于pickle.dump(信息,f) f.close () 在在在 b # 39; \ x80 \ x04 \ x957 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00} \ x94 (\ x8c \ x04name \ x94 \ x8c \ x04alex \ x94 \ x8c \ x03age \ x94K \ x16 \ x8c \ x04func \ x94 \ x8c \ x08__main__ \ x94 \ x8c \ x05hello \ x94 \ x93 \ x94u强生# 39;
对于函数你好,序列化的不是内存地址,而是整个数据对象,函数可以序列化。
<强> 4,泡菜反序列化:pickle.loads() 强>
f=open (“test2.txt",“rb") data=https://www.yisu.com/zixun/pickle.loads (f.read()) #等价于data=pickle.load (f) 打印(数据) 打印(数据(“名字”)) 打印(数据(“函数”))>> {“名称”:“tj”,“年龄”:22日func: <函数hello (0 x00000179ef69c040>} tj <函数hello (0 x00000179ef69c040>
<强> 5,多次序列化与反序列化强>
<1) json pre class="刷:py;">进口json 信息={ “name":“tj" “age": 22 } 开放(f=皌est3.txt",“w") f.write (json.dumps(信息)) 信息(& # 39;年龄# 39;]=21 f.write (json.dumps(信息)) f.close () # 在在在 序列化两次后test3中的内容 test3。txt: {“name":“tj",“age": 22} {“name":“tj",“age": 21} 开放(f=皌est3.txt",“r") #报错,py3以上,多次转储的文件反序列化报错,py2多次转储的文件也能被反序列化,先序列化的先被反序列化 data=https://www.yisu.com/zixun/json.loads (f.read ()) # json.decoder.JSONDecodeError f.close () 打印(数据)
2)泡菜
进口泡菜 信息={ “name":“tj" “age": 22 } 开放(f=皌est2.txt",“wb") f.write (pickle.dumps(信息))#等价于pickle.dump(信息,f) 信息(“sex")=芭? f.write (pickle.dumps(信息))#等价于pickle.dump(信息,f) f.close () 在在在 序列化两次后test2.txt中的内容 test2。txt:, # 65533;及# 65533;},# 65533;(和# 65533;姓名攲tj攲年龄擪u。amp; # 65533;及# 65533;%},# 65533;(和# 65533;姓名攲tj攲年龄擪,# 65533;性攲濂硵u。 开放(f=皌est2.txt",“rb") data=https://www.yisu.com/zixun/pickle.loads (f.read())第号一次反序列化正常 #数据=pickle.loads (f.read()) #第二次反序列化:EOFError:跑出输入 打印(数据) 打印(数据(“年龄”)) #打印(数据(“性”))# KeyError:“性”Python中序列化与反序列化的区别有哪些