python 序列化和反序列化

  1. 概念


    序列化:
    将对象的状态信息转换为可以存储或传输的形式的过程。就是把对象转换成字符串的过程
    
    反序列化:
    把字符串转换成python可以识别的数据类型对象的过程



  2. 应用


    #数据存储
    
    #网络传输



  3. 模块

    1. json


      #通用的序列化格式
      #只有少部分数据类型能通过json转换(数字,字符串,列表,字典,元组)
      #写文件的操作时,如果找不到ascii码的格式,就会自动转成bytes,所以要添加ensure_ascii=False的参数
      #能多次写,但不能多次读
      import json
      
      dic = {'k1','v1'}
      
      #在内存中操作
      #序列化
      str_d = json.dumps(dic)
      #反序列化
      dic_d = json.loads(str_d)
      
      #直接对文件操作
      #序列化
      f = open('file','w')
      json.dump(dic,f)
      #反序列化
      f = open('file')
      ret = json.load(f)
      
      #如果要读写多行,用对文件的每次读一行,和写的时候添加\n进行处理
      #写
      l = [dic1,dic2,dic3]
      f = open('file','w')
      for dic in l:
          str_d = json.dumps(dic)
          f.write(str_d+'\n')
      f.close()
      
      #写
      f = open('file')
      l = []
      for line in f:
          dic = json.loads(line.strip())
          l.append(dic)
      f.close()



    2. pickle


      #支持对所有python类型的处理
      #使用pickle的读写文件的操作时,是以bytes形式的,所以open要用加b的模式
      
      dic = {'k1':'v1', 'k2',:'v2'}
      
      #在内存中操作
      #序列化
      str_d = pickle.dumps(dic)
      #反序列化
      dic_d = pickle.loads(str_d)
      
      #对文件的操作
      #序列化
      f = open('file','wb')
      pickle.dump(dic,f)
      #反序列化
      f = open('file','rb')
      dic_d = pickle.load(f)
      
      #pickle直接支持多次读写



    3. shelve


      #一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
      
      import shelve
      
      #序列化
      f = shelve.open('file')
      f['key'] = {'k1':'v1', 'k2':'v2'}
      f.close()
      
      #反序列化
      f = shelve.open('file')
      ret = f['key']    #如果key不存在会报错
      f.close()
      
      #如果我们对序列化文件的内容进行修改,比如下面的操作,不会被保存,需要令writeback=True。但这方法会增加额外的内存消耗f = shelve.open('file')f['key']['k1'] = 'hahaha'  #没有被保存#需要这么写


      f = shelve.open('file',writeback=True)f['key']['k1'] = 'hahaha'