python 序列化和反序列化

Posted Walt Hwang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
      
      #如果要读写多行,用对文件的每次读一行,和写的时候添加
      进行处理
      #
      l = [dic1,dic2,dic3]
      f = open(file,w)
      for dic in l:
          str_d = json.dumps(dic)
          f.write(str_d+
      )
      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‘  

       







以上是关于python 序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章

python反序列化

Python基础 -- 函数局部变量和全局变量文件(包含序列化和反序列化)异常

Python 对象的序列和反序列化

Python_日记 序列化和反序列化

Python之序列化和反序列化

Python库:序列化和反序列化模块pickle介绍