模块之序列化 import json

1.什么是序列化模块

答:json模块用于字符串和Python数据类型间进行转换

2.:json的四个功能:分别是dumps、dump、loads、load

  2.1:dumps:将列表,字典,元组,数字-->字符串

  dumps直接操作变量,操作完成变成了一个字符串变量;

dic = {'key':'wlan','key2':'vlan','key3':'wvlan'}
import json
ret=json.dumps(dic)将字典转换成字符串
print(dic,type(dic))
print(ret,type(ret))
#{'key': 'wlan', 'key2': 'vlan', 'key3': 'wvlan'} <class 'dict'>
#{"key": "wlan", "key2": "vlan", "key3": "wvlan"} <class 'str'>
****注意转换完后是字符串表示""

  2.2loads反序列化: 将字符串转换成之前对应的数据类型  字符串-->字典   用什么转换就用什么转回去.字典转字符串转回去还是字典

res =json.loads(ret)  #字符串转化成字典
print(res,type(res))
#结果:{'key': 'wlan', 'key2': 'vlan', 'key3': 'wvlan'} <class 'dict'>

  2.3 这个结果会使1变成 字符串'1'

dic = {1 : [1,2,3],2 : (4,5,'aa')}
ret = json.dumps(dic)  # 序列化
print(dic,type(dic))
print(ret,type(ret))

res = json.loads(ret) # 反序列化
print(res,type(res))
#结果

#{1: [1, 2, 3], 2: (4, 5, 'aa')} <class 'dict'>
#{"1": [1, 2, 3], "2": [4, 5, "aa"]} <class 'str'>
#{'1': [1, 2, 3], '2': [4, 5, 'aa']} <class 'dict'

json 在所有的语言之间都通用 : json序列化的数据 在python上序列化了 那在java中也可以反序列化
# 能够处理的数据类型是非常有限的 : 字符串 列表 字典 数字
# 字典中的key只能是字符串

# 后端语言 java c c++ c#
# 前端语言 在网页上展示
# 向文件记录字典
import  json
 dic = {'key':'wlan','key2':'vlan','key3':'wvlan'}
 ret = json.dumps(dic)
 with open('json_file','a')as f:
     f.write(ret)
#从文件中读取字典
with open('json_file','r')as f:
    str_dic=f.read()
dic=json.loads(str_dic)
print(dic)
不可连续取值

需求 :就是想要把一个一个的字典放到文件中,再一个一个取出来
ic = {'key1' : 'value1','key2' : 'value2'} #写入
with open('json_file','a') as f:
    str_dic = json.dumps(dic)
    f.write(str_dic+'\n')
    str_dic = json.dumps(dic)
    f.write(str_dic + '\n')
    str_dic = json.dumps(dic)
    f.write(str_dic + '\n')

with open('json_file','r') as f:
    for line in f:
        dic = json.loads(line.strip())
        print(dic.keys())
json
dumps loads
在内存中做数据转换 :
dumps 数据类型 转成 字符串 序列化
loads 字符串 转成 数据类型 反序列化
dump load
直接将数据类型写入文件,直接从文件中读出数据类型
dump 数据类型 写入 文件 序列化
load 文件 读出 数据类型 反序列化
json是所有语言都通用的一种序列化格式
只支持 列表 字典 字符串 数字
字典的key必须是字符串
data = {'username':['李华','二愣子'],'sex':'male','age':16}
json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
print(json_dic2)
#当你的字典特别长或则特别大的时候就会写不下,所以这时会用到它的参数调整你输出的格式
#sort_keys:对字典的key值进行了排序,
#ident表示每一行的缩进
#separate表示分隔符,

这种格式一般不在存文件时应用该方法,只是让程序员看起来方便,因为相对浪费空间;

 

pickle模块

a:和json模块一样,同样也是将数据类型转为字符串

b:pickle可以将任何数据类型转为字符串;

c:pickele是以bytes格式显示的;

d:pickle的dumps和loads,dump和load跟json一样

e:不同点是pickle可以对对象操作,转为字符串

复制代码
import pickle
class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def read(self):
        print(222)
a = A('name',10)
with open('aaa',mode = 'wb')as f:
    pickle.dump(a,f)
with open('aaa','rb')as f1:
    ret = pickle.load(f1)
    print(ret.__dict__)
    ret.read()
#可用于对游戏的存档和读档
复制代码

#pickle的应用,将对象一一提取出来,用一个异常处理

复制代码
import pickle
class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def read(self):
        print(222)
a = A('name1',10)
b = A('name2',15)
c = A('name3',18)
with open('aaa',mode = 'wb')as f:
    pickle.dump(a,f)
    pickle.dump(b,f)
    pickle.dump(c,f)
with open('aaa','rb')as f1:
    while True:
        choose = True
        try:
            obj = pickle.load(f1)
            if 'name5' == obj.name:
                print(obj.__dict__)
                break
        except EOFError:
            choose = False
            break
if choose == False:        #如果没有此对象,给一个提示
    print('None')
#输出结果:
None
复制代码

这样就可以将对象的属性一一保存起来,等到用到的时候再提取出来

 

posted @ 2018-08-21 18:17  落花~伤城  阅读(991)  评论(0编辑  收藏  举报