大家都不陌生,是说把内存中变量变成可存储或传输的过程;python中称之pickle
序列化后即可存储到磁盘或传输,反序列化即将磁盘中的信息重新读到内存中。python中实现序列化模块 pickle
,如下:
import pickle
dic =dict(name="张三丰",age=18,score=90)
info=pickle.dumps(dic)
print(info)
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\t\x00\x00\x00\xe5\xbc\xa0\xe4\xb8\x89\xe4\xb8\xb0q\x02X\x03\x00\x00\x00ageq\x03K\x12X\x0
5\x00\x00\x00scoreq\x04KZu.'
序列化,并写入文件:
f=open('./log','wb')
pickle.dump(dic,f)
f.close()
序列化内容被写入log文件
注释:pickle.dumps()
方法把任意对象序列化成一个bytes
,pickle.dump()
直接把对象序列化后写入一个file-like Object
我们重新把文件中内容读到内容中:
import pickle
f=open('./log','rb')
d=pickle.load(f)
f.close()
print(d)
{'name': '张三丰', 'age': 18, 'score': 90}
json:
如果要在不同语言之间传递对象,必须为标准传输格式 xml或json
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下
JSON类型 | Python类型 |
---|---|
{} | dict 字典 |
[] | list 列表 |
string | str 字符串 |
float | int 或float |
true/false | true /false |
none | None |
Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。我们先看看如何把Python对象变成一个JSON:
import json
dic=dict(name="张三丰",age=18,score=90)
print(json.dumps(dic))
{"name": "\u5f20\u4e09\u4e30", "age": 18, "score": 90}
写入文件:
import json
f=open('./log','w')
dic=dict(name="张三丰",age=18,score=90)
json.dump(dic,f)
f.close()
#文件内形式{"name": "\u5f20\u4e09\u4e30", "age": 18, "score": 90}
json的进阶:
Python的dict
对象可以直接序列化为JSON
的{},不过,很多时候,我们更喜欢用class
表示对象,比如定义Student类,然后序列化:
import json
class Student(object):
"""docstring for ."""
def __init__(self, name,age,score):
self.name =name
self.age =age
self.score=score
s=Student('houger',20,90)
print(json.dumps(s))
TypeError: Object of type Student is not JSON serializable
运行如上代码,会出现TypeError
,Student 类对象不可以直接序列化为json
dumps()
方法的参数列表,可以发现,除了第一个必须的obj参数外,dumps()方法还提供了一大堆的可选参数:
前面的代码之所以无法把Student类实例序列化为JSON,是因为默认情况下,dumps()方法不知道如何将Student
实例变为一个JSON
的{}对象。
可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可。
def student2dic(std):
return {
'name':std.name,
'age':std.age,
'score':std.score
}
这样,Student
实例首先被student2dict()
函数转换成dict
,然后再被顺利序列化为JSON
:
print(json.dumps(s,default=student2dic))
{"name": "houger", "age": 20, "score": 90}
总结:
Python语言特定的序列化模块是pickle
,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json
模块。
json模块的dumps()
和loads()
函数是定义得非常好的接口的典范。当我们使用时,只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,我们又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。