python之序列化json模块与pickle模块(待补充)

一.json是所有语言都通用的一种序列化格式

只支持 : 列表,字典字符串,数字,且字典的key必须是字符串

 

'''

1. dumps , loads

    在内存中做数据转换:

    dumps : 数据类型 转成 字符串 ------序列化

    loads :  字符串 转成 数据类型------反序列化

2. dump , load

    直接将数据类型写入文件,直接从文件中读出数据类型

     dump 数据类型 写入 文件 序列化
load 文件 读出 数据类型 反序列化
'''

1、写操作.json文件dumps()、dump()函数
d = {
    'zll': {
        'addr': '北京',
        'age': 28
    },
    'ljj': {
        'addr': '北京',
        'age': 38
    }
}

fw = open('user_info.json', 'w', encoding='utf-8')
# ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示
# dic_json = json.dumps(d,ensure_ascii=False,indent=4)  #字典转成json格式,字典转成字符串
dic_json = json.dumps(d, ensure_ascii=True, indent=4)  # 字典转成json格式,字典转成字符串
fw.write(dic_json)
fw.close()
结果
{
    "zll": {
        "addr": "\u5317\u4eac",
        "age": 28
    },
    "ljj": {
        "addr": "\u5317\u4eac",
        "age": 38
    }
}
fw = open('user_info.json', 'w', encoding='utf-8')
# ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示
dic_json = json.dumps(d,ensure_ascii=False,indent=4)  #字典转成json,字典转成字符串
fw.write(dic_json)
fw.close()
结果 
{  9 "zll": { 10 "addr": "北京", 11 "age": 28 12  }, 13 "ljj": { 14 "addr": "北京", 15 "age": 38 16  } 17 }

dump() 操作json文件 写的操作

fw = open('user_info.json', 'w', encoding='utf-8')
json.dump(d,fw,ensure_ascii=False,indent=4)  #操作文件
fw.close()

结果
{
    "zll": {
        "addr": "北京",
        "age": 28
    },
    "ljj": {
        "addr": "北京",
        "age": 38
    }
}

2、读操作load()、loads()

# json串是一个字符串
f = open('product.json',encoding='utf-8')
res = f.read()
product_dic = json.loads(res)  #把json串,变成python的数据类型,只能转换json串内容
print(product_dic)
print(product_dic['iphone'])
# t = json.load(f)
# print(t) #传一个文件对象,它会帮你直接读json文件,并转换成python数据
# print(t['iphone'])
f.close()

结果
{'iphone': {'color': 'red', 'num': 1, 'price': 98.5}, 'wather': {'num': 100, 'price': 1, 'color': 'white'}}
{'color': 'red', 'num': 1, 'price': 98.5}
# 文件读写
def op_file(file, dict_temp=None):
    if dict_temp:
        with open(file, 'w', encoding='utf-8') as fw:
            json.dump(dict_temp, fw, ensure_ascii=False, indent=4)
        return 1
    else:
        with open(file, 'r', encoding='utf-8') as fr:
            dict_temp = json.load(fr)
        return dict_temp

 

二.pickle

  1. 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。
  2. 由任何原生类型组成的列表,元组,字典和集合。
  3. 函数,类,类的实例
 

pickle.dump(obj, file[, protocol])
  序列化对象,将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。


------------------------------------------
pickle.load(file)
  反序列化对象。将文件中的数据解析为一个Python对象。


其中要注意的是,在load(file)的时候,要让python能够找到类的定义,否则会报错:

# dumps功能
import pickle
data = ['aa', 'bb', 'cc']  
# dumps 将数据通过特殊的形式转换为只有python语言认识的字符串
p_str = pickle.dumps(data)
print(p_str)            
b'\x80\x03]q\x00(X\x02\x00\x00\x00aaq\x01X\x02\x00\x00\x00bbq\x02X\x02\x00\x00\x00ccq\x03e.
 # loads功能
 # loads  将pickle数据转换为python的数据结构
 mes = pickle.loads(p_str)
 print(mes)
 
#['aa', 'bb', 'cc']
 # dump功能
 # dump 将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件
 with open('D:/tmp.pk', 'w') as f:
     pickle.dump(data, f)
 # load功能
 # load 从数据文件中读取数据,并转换为python的数据结构
 with open('D:/tmp.pk', 'r') as f:
     data = pickle.load(f)

 

 


posted @ 2018-08-22 17:11  卍风衍  阅读(149)  评论(0编辑  收藏  举报