zoukankan      html  css  js  c++  java
  • json和pickle模块

    JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。

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

    Json   模块提供了四个方法: dumps、dump、loads、load

    pickle 模块也提供了四个功能:dumps、dump、loads、load

    json的格式

    对象

    对象在python类似字典,表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值
    {
        "name": "laowang",
        "age": "18",
        "sex": "nan"
    }

    数组

    数组是中括号“[]”括起来的内容,在python中类似字典,数据结构为 ["value1","value2","value3",...],取值方式和所有语言中一样,使用索引获取
    {
        "name": "中国",
        "province": [
            {
                "name": "黑龙江",
                "cities": {
                    "city": [
                        "哈尔滨",
                        "大庆"
                    ]
                }
            },
            {
                "name": "广东",
                "cities": {
                    "city": [
                        "广州",
                        "深圳",
                        "珠海"
                    ]
                }
            }
        ]
    }

    json模块

    首先要知道为什么要使用json。目前很有多的编程语言,关于数据,不同的语言有不用的存储方式,这就对不同编程语言之间的数据的交互带来了麻烦。json就是为了解决这个问题而出现。

    dumps和dump

    dumps和dump又称为是序列化方法
    • dumps:只完成了序列化,序列化的时候是分为两步,首先将所有的双引号和单引号都规范为双引号,然后再转成一个字符串。
    • dump:需要传入文件描述符,然后将序列化后的str保存到文件中
    >>> import json
    >>> json.dumps([])    # dumps可以格式化所有的基本数据类型为字符串
    '[]'
    >>> json.dumps(1)    # 数字
    '1'
    >>> json.dumps('1')   # 字符串
    '"1"'
    >>> dict = {"name":"Tom", "age":23}  
    >>> json.dumps(dict)     # 字典
    '{"name": "Tom", "age": 23}'
    a = {"name":"Tom", "age":23}
    with open("test.json", "w", encoding='utf-8') as f:
        # indent 超级好用,格式化保存字典,默认为None,小于0为零个空格
        f.write(json.dumps(a, indent=4))
        # json.dump(a,f,indent=4)   # 和上面的效果一样,就是不用write了

    loads和load

    loads和load又称为反序列化方法
    • loads:只完成了反序列化,也就是将字符中的原有数据提取出来,反序列化的时候要注意要反序列化的数据格式必须满足json的规范要求。
    • load:只接收文件描述符,就完成了读取文件和反序列化
    个人推荐最好不要用eval(),因为如果可以运算的字符串,结果就会和应该的到的不一致,比如字符串里有含有"1+2",本来就是个字符串,但是结果是以"3"的方式输出的。
    >>> json.loads('{"name":"Tom", "age":23}')
    {'age': 23, 'name': 'Tom'}
    import json
    with open("test.json", "r", encoding='utf-8') as f:
        aa = json.loads(f.read())
        f.seek(0)
        bb = json.load(f)    # 与 json.loads(f.read()),相当于是没有了read的操作
    print(aa)
    print(bb)
    
    # 输出:
    {'name': 'Tom', 'age': 23}
    {'name': 'Tom', 'age': 23}

    pickle模块

     json模块和pickle模块都有  dumps、dump、loads、load四种方法,而且用法一样。

    不用的是json模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串,

    而picle模块序列化出来的只有python可以认识,其他编程语言不认识的,表现为乱码

    不过picle可以序列化函数,但是其他文件想用该函数,在该文件中需要有该文件的定义(定义和参数必须相同,内容可以不同)

    相较于json来说,序列化和反序列化的速度要更快一些。
    因为使用和json模块基本一致,就是换个模块名,只要知道区别就行了,简单放个例子,就不多说了
    >>> import pickle
    
    >>> d = {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
    >>> s = pickle.dumps(d)
    >>> s
    b'x80x03}qx00(Xx01x00x00x001qx01}qx02(Xx05x00x00x00countqx03K
    Xx08x00x00x00selectedqx04x88uXx01x00x00x002qx05}qx06(hx03Kx14hx04x89uu.'
    >>> pickle.loads(s)
    {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
  • 相关阅读:
    Git 安装
    golang学习笔记--struct同时用于bson json
    golang学习笔记--struct、json、map互相转化
    IDEA关联不同项目源码
    xss攻击atob
    maven设置编辑级别,设置编码来源
    AppleScript创建新文件
    Java线程池吃掉异常整理
    docker 启动中间件整理
    docker container启动之后 命令更新
  • 原文地址:https://www.cnblogs.com/kuxingseng95/p/9458855.html
Copyright © 2011-2022 走看看