zoukankan      html  css  js  c++  java
  • python序列化模块json和pickle

    序列化相关

    1. json

    • 应用场景:

    json模块主要用于处理json格式的数据,可以将json格式的数据转化为python的字典,便于python处理,同时也可以将python的字典或列表等对象转化为json格式的数据,便于跨平台或跨语言进行数据交互

    • 功能:

      • Json模块提供了四个功能:dumps、dump、loads、load

      • Python 编码为 JSON 类型转换对应表:

       
      PythonJSON
      dict object
      list, tuple array
      str string
      int, float, int- & float-derived Enums number|
      True true
      False false
      None null
      • JSON 解码为 Python 类型转换对应表:
      JSONPython
      object dict
      array list
      string str
      number (int) int
      number(real) float
      true True
      false False
      null None
    • 具体应用

      • dumps 和 loads 用于python对象和字符串间的序列化和反序列化

      dumps:将python 基本数据类型转化为json格式数据类型
      loads:将json格式数据类型转化为python数据类型

      #!/usr/bin/env python
      # -*- coding: UTF-8 -*-
      #pyversion:python3.5
      #owner:fuzj
      
      import json
      
      s1 = '{"key1":"value1"}'      #字符串只能是这个格式的,才能被json转换   通过loads进行反序列化时,必须使用双引号
      
      d1 = {'key2':'value2'}
      
      s2 = json.loads(s1)      #使用loads反序列化
      print('s1的内容:',s1)
      print("s1的类型:",type(s1))
      print('s2的内容:',s2)
      print("s2的类型:",type(s2))
      
      d2 = json.dumps(d1)
      print('d1的内容:',d1)
      print("d1的类型:",type(d1))
      print('d2的内容:',d2)
      print("d2的类型",type(d2))
      

      输出结果: s1的内容: {
      "key1":"value1"} s1的类型: <class 'str'> s2的内容: {'key1': 'value1'} s2的类型: <class 'dict'> #经loads处理之后,str变味dict d1的内容: {'key2': 'value2'} d1的类型: <class 'dict'> d2的内容: {"key2": "value2"} d2的类型 <class 'str'> #经dumps处理之后,dict变为str
      • dump 和load 用于对文件进行序列化和反序列化

      dump:主要用于json文件的读写,json.dump(x,f),x是对象,f是一个文件对象,这个方法可以将json字符串写入到文本文件中
      load:加载json文件

      ```
      #!/usr/bin/env python
      # -*- coding: UTF-8 -*-
      #pyversion:python3.5
      #owner:fuzj
      
      import json
      
      s1 = '{"key1":"value1"}'      #字符串只能是这个格式的,才能被json转换   通过loads进行反序列化时,必须使用双引号   
      d1 = {'key2':'value2'}
      
      json.dump(d1,open('序列化.txt','w'))  #将s1序列化,并写入文件
      e1 = json.load(open('序列化.txt','r'))  #读取json文件
      print("e1的类型:",type(e1))
      print('e1的内容:',e1)
      
      ```
      输出结果:
      
      e1的类型: <class 'dict'>
      e1的内容: {'key2': 'value2'}

    2. pickle

    • 应用场景

    pickle模块实现了基本的数据序列和反序列化,和json的功能类似。
    通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储,也可以简单的将字符进行序列化
    通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象,也可以将字符进行反序列化。和json不同的是:json 更适合跨语言 可以处理字符串,基本数据类型;pickle python专有,更适合处理复杂类型的序列化

    • 功能
      pikle模块提供 dumps loads dump load四个基本功能

    • 具体应用

      • dumps 和loads 用于python对象和字符串间的序列化和反序列化

      dumps 和json.dumps功能一样,但是以字节对象形式返回封装的对象
      loads和json.loads功能一样,从字节对象中读取被封装的对象,并返回

      #!/usr/bin/env python
      # -*- coding: UTF-8 -*-
      #pyversion:python3.5
      #owner:fuzj
      
      import pickle
      
      s1 = '{"key1":"value1"}'      #字符串只能是这个格式的,才能被json转换   通过loads进行反序列化时,必须使用双引号
      
      d1 = {'key2':'value2'}
      
      s3 = pickle.dumps(s1)
      print('s1的内容:',s1)
      print("s1的类型:",type(s1))
      print('s3的内容:',s3)
      print("s3的类型:",type(s3))
      
      d3 = pickle.loads(s3)
      print('d1的内容:',d1)
      print("d1的类型:",type(d1))
      print('d3的内容:',d3)
      print("d3的类型",type(d3))
      输出结果:
      
      s1的内容: {"key1":"value1"}
      s1的类型: <class 'str'>
      s3的内容: b'x80x03Xx11x00x00x00{"key1":"value1"}qx00.'
      s3的类型: <class 'bytes'>   #dumps处理之后返回的是字节类型
      d1的内容: {'key2': 'value2'}
      d1的类型: <class 'dict'>
      d3的内容: {"key1":"value1"}
      d3的类型 <class 'str'>
      • dump 和load 用于对文件进行序列化和反序列化.python数据持久化用的比较多

        • pickle.dump(obj, file, [,protocol])
            注解:将对象obj保存到文件file中去。
            protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;1:老式的二进制协议;2:2.3版本引入的新二进制协议,较以前的更高效。其中协议0和1兼容老版本的python。protocol默认值为0。
            file:对象保存到的类文件对象。file必须有write()接口, file可以是一个以'w'方式打开的文件或者一个StringIO对象或者其他任何实现write()接口的对象。如果protocol>=1,文件对象需要是二进制模式打开的。

        • pickle.load(file)
            注解:从file中读取一个字符串,并将它重构为原来的python对象。
            file:类文件对象,有read()和readline()接口

      #!/usr/bin/env python
      # -*- coding: UTF-8 -*-
      #pyversion:python3.5
      #owner:fuzj
      
      import json
      import pickle
      
      s1 = '{"key1":"value1"}'      #字符串只能是这个格式的,才能被json转换   通过loads进行反序列化时,必须使用双引号
      
      d1 = {'key2':'value2'}
      
      pickle.dump(s1,open('序列化.txt','wb'))   #注意需使用二进制方式写入文件
      e2 = pickle.load(open('序列化.txt','rb'))   #需使用二进制方式读取文件
      print("e2的类型:",type(e2))
      print('e2的内容:',e2)
      输出结果:
      
      e2的类型: <class 'str'>
      e2的内容: {"key1":"value1"}
    
    
  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/pycode/p/5575342.html
Copyright © 2011-2022 走看看