wslhs 发表于 2018-8-13 09:37:15

Python20 jason and pickle序列化

概念
  vmware虚拟机,在挂起的时候不是以数据库来存储当前数据的,而是将数据存储到文件中,不过能存储到文件中的只有字符串和二进制,这个文件存储到硬盘中。
  那么vmware在恢复挂起的时候,又需要从文件中读取数据,可是之前我们存储的时候无论什么数据只要存储到文件中就是字符串,但我们恢复读取时也是字符串,那么如何将其恢复为原有的数据。
  比如字典类型的字符串数据从文件中读取到python中后还是字典。
  

info ={  
'name':'zhangsan',
  
'age':22
  
}
  

  
f = open('test.txt','w')
  
f.write(str(info))            #通过str将写入的数据改为字符串格式
  
f.close()
  


  这里是通过eval实现,将字符串读取后转为相应的数据格式。


json
  

import json  

  
info ={
  
'name':'zhangsan',
  
'age':22
  
}
  

  
x = json.dumps(info)    #序列化:将数据序列化(变为str数据类型)
  
print (type(x))
  


  可以看到当前数据类型是字符串
  

f = open('test.txt','w')  
f.write(json.dumps(info))   #将数据从内存中存储到硬盘的文件中。
  
f.close()
  

  
import json
  

  
f = open('test.txt','r')
  
data = json.loads(f.read())    #反序列化:只有通过json写入的数据,才能通过json读取,读取到内存中
  
print (data,type(data))
  


  

print (data['age'])  



  .
  报错,新增的函数内存地址是一个不可序列化的类型,所以说 json 只能处理简单的数据类型,比如字典、列表、字符串这样的。
  json除了python,json还在其他几乎所有语言中也支持,所以json主要用于不同语言之间的数据交互(不同语言之间的数据转换)。
  较复杂的数据在不同语言之间完全不一样,所以json只能处理简单的数据。

pickle
  pickle和json的用法完全一样,只是名字换了而已。




  看着像是乱码,其实是二进制,只不过是pickle语法处理的规则导致这样,这里千万不要理解为乱码就是加密。


  读取权限为rb,读取时也使用pickle,不过这里却报错了,这是因为在写入和读取时是在两个.py文件中运行的,写入时sayhi这个函数存在'序列化.py'文档中,当'序列化.py'这个程序运行完成时,sayhi这个内存地址就会从内存中剔除,所以当'反序列化.py'这个文档运行读取时在内存中找不到这个内存地址,所以会报错。

  在'反序列化.py'这个文档中将sayhi这个函数加进去,此时内存中就有了sayhi这个函数的内存地址,这时再去运行就不会报错了。

  json可以被多语言支持
  pickle只能在python之间支持


[*]dump、load
  除了dumps外还有dump,使用dump的话写法不一样,可以看到语法提示中obj是对象,file是文件



  使用load


[*]多次dumps


  可以看到多次dumps是可以实现的


  在python3中却不能多次loads,会报错,在python2中可以;不过多次dumps和多次loads没有任何意义,比如在vmware中,可以有多个快照,每一个快照数据都存在一个单独的文件中,而不是多个快照都存在同一个文件中,所以dumps只需要进行一次,然后loads一次就可以了。
页: [1]
查看完整版本: Python20 jason and pickle序列化