序列化:要想把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"} <class 'str'>
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'} <class 'dict'>
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)) #<class 'bytes'>
dic2=pickle.loads(str1)
print(dic2,type(dic2)) #{'a': 1, 'sdf': 15, 'dsfkjl': 'sdfjk'} <class 'dict'>
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()