序列化:把一个对象,从内存中变成一个可存储,可传输的过程。
json 不能序列化函数和类。json模块可以与其它程序进行接口对接。
pickle 是python专有的一个序列化模块,可以序列化函数,但不能与其它语言进行接口。
shelve模块更灵活,只有一个open方法。
import json
dic = {"name": "gf", "age": "20"}
aa = json.dumps(dic) # 序列化aa这个字典
f = open("test", "w")
f.write(aa)
f.close()
import json
f=open("test","r")
data=f.read()
data=json.loads(data) #反序列化
print(data["name"]) #打印 test 文件里边 name 这个键值对的内容。
f.close()
pickle:( 不经常用,知道就行了 )
import pickle
def foo():
print("ok")
aa = pickle.dumps(foo)
f = open("test.text", "wb") # 注意这里,要用 wb (二进制)模式写入。
f.write(aa)
f.close()
import pickle
def foo():
print("ok") # 由于众文件里取出的函数名没有内存地址,所以必须在这里还得有一个同样的函数。
f=open("test.text","rb")
data=f.read()
data=pickle.loads(data)
data()
import shelve
f = shelve.open("test.text") # 它会同时建立三个文件,不用管,用时还使用test.text文件名就可以
f["info"] = {"name": "gf", "sex": "男"}
f["info1"]={"name":"小强","sex":"女"}
import shelve
f = shelve.open(r"test.text")
print(f.get("info"))
print(f.get("info1"))
data=f.get("info1")
print(data["name"])
补充一个知识点:
d={"name":"gf","age":"12"}
print(d["name"])
print(d.get("name")) # 在取值时d.get("name")==d["name"],但不能全盘 get方法给字典赋值。
print(d.get("sex","mail")) # d 里没有 sex 这个键值,默认返回 None 在后面加了 mail之后,返回 mail