day5-json & pickle序列化
一、简述
我们在写入文件中的数据,只能是字符串,但是如果要想把内存的数据对象存到硬盘上去怎么办呐?下面就来说说序列化:json & pickle
二、json序列化
1、dumps序列化和loads反序列化
dumps()序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 | import json #导入json模块 info = { 'name' : "zhangqigao" , "age" : 22 } with open ( "test.txt" , "w" ) as f: #以普通模式写入 data = json.dumps(info) #把内存对象转为字符串 f.write(data) #写到文件中 #text.txt文件中的内容 { "name" : "zhangqigao" , "age" : 22 } |
loads()反序列化
1 2 3 4 5 6 7 8 9 | import json with open ( "test.txt" , "r" ) as f: #以普通模式读 data = json.loads(f.read()) #用loads反序列化 print (data.get( "age" )) #输出 22 |
2、dump序列化和load反序列化
dump()序列化
1 2 3 4 5 6 7 8 9 10 11 12 | import json info = { 'name' : "zhangqigao" , "age" : 22 } with open ( "test.txt" , "w" ) as f: #文件以写的方式打开 json.dump(info,f) #第1个参数是内存的数据对象 ,第2个参数是文件句柄 #text.txt文件中的内容 { "name" : "zhangqigao" , "age" : 22 } |
load()反序列化
1 2 3 4 5 6 7 8 9 | import json with open ( "test.txt" , "r" ) as f: #以读的方式打开文件 data = json.load(f) #输入文件对象 print (data.get( "age" )) #输出 22 |
3、序列化函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import json def sayhi(name): #函数 print ( "name:" ,name) info = { 'name' : "zhangqigao" , "age" : 22 , "func" :sayhi #引用sayhi函数名 } with open ( "test.txt" , "w" ) as f: json.dump(info,f) #序列化info数据对象 #输出 File "D:\Python\Python35\lib\json\encoder.py" , line 403 , in _iterencode_dict yield from chunks File "D:\Python\Python35\lib\json\encoder.py" , line 436 , in _iterencode o = _default(o) File "D:\Python\Python35\lib\json\encoder.py" , line 179 , in default raise TypeError( repr (o) + " is not JSON serializable" ) TypeError: <function sayhi at 0x00000000006DD510 > is not JSON serializable #不支持jsom序列化 |
小结:
- dumps和loads是成对使用的,dump和load是成对使用的。
- dumps和loads由于序列化的是内容,所以后面要加s,但是dump和load序列化的内容是对象,所以单数。
- json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。
- json是所有语言通用的,所有语言都支持json,如果我们需要python跟其他语言进行数据交互,那么就用json格式。
二、pickle序列化
1、dumps序列化和loads反序列化
dumps()序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pickle info = { 'name' : "zhangqigao" , "age" : 22 , } with open ( "test.txt" , "wb" ) as f: #以二进制的形式写入 data = pickle.dumps(info) #序列化成字符串 f.write(data) #写入test.txt 文件中 #输出到test.txt文件中的内容 �}q (X ageqKX nameqX zhangqigaoqu. |
loads()反序列化
1 2 3 4 5 6 7 8 9 | import pickle with open ( "test.txt" , "rb" ) as f: #以二进制的模式读 data = pickle.loads(f.read()) #反序列化操作 print (data.get( "age" )) #输出 22 |
2、dump序列化和load反序列化
dump()序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pickle info = { 'name' : "zhangqigao" , "age" : 22 , } with open ( "test.txt" , "wb" ) as f: pickle.dump(info,f) #序列化 #输出 �}q (X ageqKX nameqX zhangqigaoqu. |
load()反序列化
1 2 3 4 5 6 7 8 9 | import pickle with open ( "test.txt" , "rb" ) as f: data = pickle.load(f) #反序列化成内存对象 print (data.get( "age" )) #输出 22 |
从上面的结果观察,json和pickle好像也没什么区别?但是别忘了,我们说,json只能序列化简单的数据类型,而pickle可以序列化python中所有的数据类型,包括函数、类等,下面我们就来看看,如何序列化函数的。还有就是,pickle序列化的是字节,而json序列化的是字符,这个要注意一下。
3、序列化函数
①序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import pickle def sayhi(name): #函数 print ( "hello:" ,name) info = { 'name' : "zhangqigao" , "age" : 22 , "func" :sayhi #"func"对应的值sayhi,是函数名 } with open ( "test.txt" , "wb" ) as f: data = pickle.dumps(info) f.write(data) #输出test.txt �}q (X funcqc__main__ sayhi qX ageqKX nameqX zhangqigaoqu. |
②反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import pickle def sayhi(name): #在反序列化中必须写上此函数,不然会报错,因为在加载的时候,函数没有加载到内存 print ( "hello:" ,name) with open ( "test.txt" , "rb" ) as f: data = pickle.loads(f.read()) print (data.get( "age" )) data.get( "func" )( "zhangqigao" ) #执行函数sayhi #输出 22 hello: zhangqigao #输出的函数体中的逻辑也是可以变的,这边我就不做演示了 |
小结:
- json值支持简单的数据类型,pickle支持所有的数据类型。
- pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
- pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。
- pickle和json在3.0中只能dump一次和load一次,在2.7里面可以dump多次,load多次,anyway,以后只记住,只需要dump一次,load一次就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 因为Apifox不支持离线,我果断选择了Apipost!
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端