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'\x80\x03]q\x00(X\x02\x00\x00\x00aaq\x01X\x02\x00\x00\x00bbq\x02X\x02\x00\x00\x00ccq\x03e.'
>>> 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

 

posted @ 2019-01-22 13:16 梦徒 阅读(...) 评论(...) 编辑 收藏