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}}
原文地址:https://www.cnblogs.com/kuxingseng95/p/9458855.html