python-序列化

序列化:要想把Python的对象存储到文件里或者用于网络发送,需要把python对象序列化成字符串才能保存

python里常用的序列化模块有三种:

json模块

json是通用的网络传输数据格式,多种语言都支持,尤其是网络变成的时候用的更广泛

不过如果在一个文件里写入多个json对象,load的时候会报错

import json

dic1={'a':1,"sdf":15,"dsfkjl":"sdfjk"}

str1=json.dumps(dic1)         #反过来 dic1=json.loads(str1)   把字符串转为字典

                                            #如果字典里有中文,可以设置dumps的第二个参数 ensure_ascii=False   结果即可正常显示中文 json.dumps(dic1,ensure_assii=Flase)

print(str1,type(str1))            #{"a": 1, "sdf": 15, "dsfkjl": "sdfjk"}

with open('test','w',encoding="utf-8") as f:

    f.write(str1)

#也可以直接这样写入文件

dic3={"dfasdf":"dsfasdfk"}

with open('test1','w',encoding="utf-8")as f:

    json.dump(dic3,f)


#读取文件对象像下面这样操作

with open("test",'r',encoding="utf-8")as f:

str2=json.load(f)

print(str2)

dic2=dict(str2)

print(dic2,type(dic2))        #{'a': 1, 'sdf': 15, 'dsfkjl': 'sdfjk'}


pickle模块

方法同上 load dump loads dumps

pickle模块是Python所特有的,对一些python独有额数据类型只支持会良好(比如元组,集合)

#不同的是pickle模块读写文件都是采用二进制 ,需要打开模式为 wb rb,另外,pickle可以写入多个对象的序列化,然后依次反序列化即可挨个获得出来,不会报错


import pickle

dic1={'a':1,"sdf":15,"dsfkjl":"sdfjk"}

str1=pickle.dumps(dic1)

print(type(str1))        #

dic2=pickle.loads(str1)

print(dic2,type(dic2))            #{'a': 1, 'sdf': 15, 'dsfkjl': 'sdfjk'}

dic3=[1,2,3,4,5,78]

dic4=(1,2,34,87,8,9)

with open("test",'wb')as f:

    pickle.dump(dic1,f)

    pickle.dump(dic3, f)

    pickle.dump(dic4, f)

#读取

with open("test",'rb')as f:

    dics=pickle.load(f)

    dics1=pickle.load(f)

    dics2 = pickle.load(f)

    print(dics,dics1,dics2)                #{'a': 1, 'sdf': 15, 'dsfkjl': 'sdfjk'} [1, 2, 3, 4, 5, 78] (1, 2, 34, 87, 8, 9)


shelve 模块 把文件当成对象来操作 存储的键值对 ,也可以存储对象函数等

不需要自己建aa这个文件,shelve会帮你创建三个以aa为名字的文件  aa.dir   aa.dat   aa.bak

import shelve

class Person:    

    def __init__(self,name,age):

        self.name=name;

        self.age=age

    def sayName(self):

        print(self.name)

#存储

with shelve.open("aa")as f:

    f['person']=Person

    f['a']=10

    f['b']=8

#读取

with shelve.open("aa")as f:

    person=f['person']

    p=person('abai',30)

    p.sayName()

你可能感兴趣的:(python-序列化)