序列化模块

序列化模块   import json
应用的地方: 有两方面会用到 1,网络传输. 2,写文件.

json 格式的限制
1,json 格式的key必须是字符串数据类型
2,json 对元组做value的字典会把元组强行转换成列表
3,不支持元组做key,会报错
4,json 格式中的字符串必须""引起来的
5,set 类型不能转

有四个方法
dumps
loads
dump
load

序列化 , 反序列化
# 序列化
import json
dic={'aaa':'bbb','ccc':'ddd'}
str_dic=json.dumps(dic)     #序列化:将一个字典转换成一个字符串
print(str_dic,type(str_dic))
# 结果:{"aaa": "bbb", "ccc": "ddd"} 
# json转换完的字符串类型的字典中的字符串是由""表示的


# 反序列化
dic2=json.loads(str_dic)        #将一个字符串格式的字典转换成一个字典
print(type(dic2),dic2)
# 结果: {'aaa': 'bbb', 'ccc': 'ddd'}
# 要用json的loads功能处理字符串类型的字典中的字符串必须是由""表示

 

嵌套中的序列化,反序列化

import json
lst_dic=[1,2,3,{'k1':'n1','k2':'m2'},4,5,6]
str_dic=json.dumps(lst_dic)     #嵌套在另一个数据类型里面也可以转(序列化)
print(type(str_dic),str_dic)
# 结果:  [1, 2, 3, {"k1": "n1", "k2": "m2"}, 4, 5, 6]

lst_dic2=json.loads(str_dic)    #同样是嵌套,也可以反序列化
print(type(lst_dic2),lst_dic2)
# 结果:  [1, 2, 3, {'k1': 'n1', 'k2': 'm2'}, 4, 5, 6]

 

元组作为value的字典会把元组强制转换成列表
import json
dic={'asd':(1,2,3)}
str_dic=json.dumps(dic)     #元组作为value的字典会把元组强制转换成列表
print(type(str_dic),str_dic)
# 结果:  {"asd": [1, 2, 3]}

 

 

dump 和 load   操作文件(只适合dump一次,load一次)
lst=['aaa',1223,'rrr','fff']
with open('json_f','w')as f:
    json.dump(lst,f)
# 结果:["aaa", 1223, "rrr", "fff"]
with open('json_f','r')as f:
    ret=json.load(f)
    print(ret)
# 结果:['aaa', 1223, 'rrr', 'fff']

 

想要dump多个数据进入文件用dumps
import json
lst=['aaa',1223,'rrr','fff']
lst_dic=[1,2,3,{'k1':'1','k2':'2'},4,5,6]
with open('json_f','w')as f:
    str_lst=json.dumps(lst)     #一次dumps(序列化)一个数据
    str_dic=json.dumps(lst_dic)
    f.write(str_lst+'\n')       #dumps完成后数据就被序列化了(变成字符串类型,单引号变双引号)不会直接写进文件,还需要write写入文件,写入的时候记得换行
    f.write(str_dic+'\n')       #数据写进去之后都会变成字符串类型,而且单引号都会变成双引号
# 结果: # ["aaa", 1223, "rrr", "fff"]
#         [1, 2, 3, {"k1": "1", "k2": "2"}, 4, 5, 6]
with open('json_f','r')as f:
    for i in f:         #先把文件内容循环出来,然后再反序列化,使数据还原回本来的样子
        ret=json.loads(i)       #反序列化上面是用的dumps这里必须要用loads才读的出来,用load会报错
        print(type(ret),ret)
# 结果: # ['aaa', 1223, 'rrr', 'fff']
#         [1, 2, 3, {'k1': '1', 'k2': '2'}, 4, 5, 6]

 

 

import pickle   模块
pickle要配合dumps(dump) 和 loads(load)一起用 例: pickle.dumps('内容')
pickle.dumps() 转化出来的是bytes类型
pickle.loads() 就是把bytes类型的转化成字符类型

例:
import pickle
dic = {1:(12,3,4),('a','b'):4}
dic1=pickle.dumps(dic)      #将字典转化成bytes类型
dic2=pickle.loads(dic1)     #将bytes类型转换为原本类型
print(dic1)
print(dic2)
# 结果: b'\x80\x03}q\x00(K\x01K\x0cK\x03K\x04\x87q\x01X\x01\x00\x00\x00aq\x02X\x01\x00\x00\x00bq\x03\x86q\x04K\x04u.'

 

通过例题具体看一下
class Student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
a1 = Student('alex',83)       #实例化对象
ret = pickle.dumps(a1)        #通过pickle.dumps转化成bytes类型
print(ret)
小花 = pickle.loads(ret)        #反序列化还原成本来的样子,赋值给一个变量
print(小花.name)        #通过变量.取具体的值
print(小花.age)

 

转化成bytes类型存入文件,再读出来
import pickle
class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
a1=Student('小明',17)       #实例化对象
with open('json_f','wb')as f:     #转化成bytes类型后要以'wb'的模式写入文件
    pickle.dump(a1,f)         #转化成bytes类型
with open('json_f','rb')as f:         #bytes类型读成字符类型要以'rb'的模式
    a2=pickle.load(f)       #反序列化,还原以前的类型
    print(a2.age)

 

转载于:https://www.cnblogs.com/hdy19951010/p/9450555.html

你可能感兴趣的:(序列化模块)