• python 序列化模块之 json 和 pickle


    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,支持不同程序之间的数据转换.但是只能转换简单的类型如:(列表、字典、字符串、数字、)等,比如日期格式、类对象等json就处理不了。

    在python中,有专门处理json格式的模块  json 和 pickle模块:

    json模块用于字符串和python数据类型间进行转换;pickle模块用于python特有的类型和python的数据类型间进行转换,而且都提供了dumps、dump、loads、load 4个功能,用法也一样,不用的是json模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串,而pickle模块序列化出来的只有python可以认识,其他编程语言不认识的,表现为乱码。

    json模块使用实例:

    引用模块:

    import json

    序列化方法, 将python对象转换成其他语言通用的字符串类型:

    json.dump        将数据通过特殊的形式转为所以程序语言都认识的字符串,并写入文件.
    json.dumps       将数据通过特殊的形式转换为所以程序语言都认识的字符串

    实例:

    #!/usr/bin/env python
    #coding:utf-8
    
    import json
    
    obj = [123,[1,2,3],'abc',{ 'key' : 'value' ,'key2' : (4,5,6)}]
    p = json.dumps(obj)
    
    print("obj类型:",type(obj))
    print(repr(obj))
    print("json.dumps后类型:",type(p))
    print(p)
    
    ---------------------------------------------
    执行结果:
    obj类型: <class 'list'>
    [123, [1, 2, 3], 'abc', {'key': 'value', 'key2': (4, 5, 6)}]
    json.dumps后类型: <class 'str'>
    [123, [1, 2, 3], "abc", {"key": "value", "key2": [4, 5, 6]}]
    
    #通过输出的结果可以看出,简单类型通过encode之后跟其原始的repr()输出结果非常相似,但是有些数据类型进行了改变,例如上例中的元组则转换为了列表。在json的编码过程中,会存在从python原始类型向json类型的转化过程.

     json.dump() 示例:

    #!/usr/bin/env python
    #coding:utf-8
    
    import json
    
    dist = {'name' : 'saneri','age' : 18}
    
    with open('test.json','w',encoding='utf-8') as f:
    
        json.dump(dist,f,indent=4)    #indent 超级好用,格式化保存字典,默认为None,小于0为零个空格,此处为4个空格
        #f.write(json.dumps(dist,indent=4))   # 和上面的效果一样

    保存的文件test.json效果:

    python 原始类型向 json 类型的转化对照表:

    PythonJSON
    dict object
    list, tuple array
    str, unicode string
    int, long, float number
    True true
    False false
    None null

    反序列化方法,把Json格式字符串解码转换成Python对象:

    json.load     将一个包含JSON格式数据的可读文件反序列化为一个python对象。
    json.loads    将包含str类型的JSON文档反序列化为一个python对象

    实例:

    #json.load示例
    >>> import json
    >>> dict = {"name" : "saneri","age" : 23}
    >>> json.dumps(dict)         #将python对象转为所以程序有认识的json字符中
    '{"name": "saneri", "age": 23}'
    >>> 
    >>> json.loads('{"name": "saneri", "age": 23}'   #将json字符串转为python对象.
    ... )
    {'name': 'saneri', 'age': 23}
    
    ##################################
    
    #从json文件中读取字符串方法。
    with open("test.json", "r", encoding='utf-8') as f:
        aa = json.loads(f.read())    #loads读取方法
        f.seek(0)
        bb = json.load(f)    # load读取方法,与 json.loads(f.read())相同 
    print(aa)
    print(bb)
    
    ----------------------------------------
    执行结果:
    
    {'name': 'saneri', 'age': 18}
    {'name': 'saneri', 'age': 18}

    json 类型转换到 python 的类型对照表:

    JSONPython
    object dict
    array list
    string unicode
    number (int) int, long
    number (real) float
    true True
    false False
    null None

    pickle模块使用实例:

    pickle,用于python特有的类型 和 python的数据类型间进行转换 。

    pickle.dumps    将数据通过特殊的形式转换为只有python语言认识的字符串
    pickle.dump   将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件
    pickle.loads   将pickle数据转换为python的数据结构
    pickle.load     从数据文件中读取数据,并转换为python的数据结构

    实例应用:

    1.dumps和loads示例:

    >>> import pickle
    >>> data = ['aa', 'bb', 'cc']
    >>> p_str = pickle.dumps(data)     #dumps 将数据通过特殊的形式转换为只有python语言认识的字符串
    >>> print(p_str)
    b'x80x03]qx00(Xx02x00x00x00aaqx01Xx02x00x00x00bbqx02Xx02x00x00x00ccqx03e.'
    >>> mes = pickle.loads(p_str)    # loads  将pickle数据转换为python的数据结构
    >>> print(mes)
    ['aa', 'bb', 'cc']
    >>> 

    2.dump和load示例:

    import pickle
    
    data = ['aa','bb','cc']
    
    with open('test.pki','wb') as f:
        pickle.dump(data, f)        # dump 将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件
    
    
    with open('test.pki','rb') as f:
        data = pickle.load(f)       # load 从数据文件中读取数据,并转换为python的数据结构
        print(data)

     参考文档:

        https://www.cnblogs.com/saneri/p/5015769.html

  • 相关阅读:
    Go panic+defer+recover理解加使用
    golang atomic包的使用
    Mongo 锁的理解
    AudioManager(录音)
    SAXpraseHelper
    Density
    CustomDialog
    CustomScrollVeiw(双向滑动)
    tf的concat问题
    tensorflow的gpu版本错误
  • 原文地址:https://www.cnblogs.com/saneri/p/10303251.html
Copyright © 2020-2023  润新知