在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:
d = dict(name='Bob', age=20, score=88)
序列化就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
Python提供两个模块来实现序列化:cPickle
和pickle
。这两个模块功能是一样的,区别在于cPickle
是C语言写的,速度快,pickle
是纯Python写的,速度慢,跟cStringIO
和StringIO
一个道理。用的时候,先尝试导入cPickle
,如果失败,再导入pickle
:
try: import cPickle as pickle except ImportError: import pickle
pickle.dumps()方法把任意对象序列化成一个str,然后,就可以把这个str写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:
f = open('dump.txt', 'wb') pickle.dump(d, f) f.close()
当我们要把对象从磁盘读到内存时,可以先把内容读到一个str,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:
f = open('dump.txt', 'rb') d = pickle.load(f) f.close() d {'age': 20, 'score': 88, 'name': 'Bob'}
JSON:
Python内置的json
模块提供了非常完善的Python对象到JSON格式的转换:
dumps()
方法返回一个str
,内容就是标准的JSON。类似的,dump()
方法可以直接把JSON写入一个file-like Object
。
要把JSON反序列化为Python对象,用loads()
或者对应的load()
方法,前者把JSON的字符串反序列化,后者从file-like Object
中读取字符串并反序列化
import json d = dict(name='Bob', age=20, score=88) json.dumps(d) #'{"age": 20, "score": 88, "name": "Bob"}' json_str = '{"age": 20, "score": 88, "name": "Bob"}' json.loads(json_str) #{u'age': 20, u'score': 88, u'name': u'Bob'}
注意,就是反序列化得到的所有字符串对象默认都是unicode
而不是str
。由于JSON标准规定JSON编码是UTF-8.
JSON进阶
Python的dict
对象可以直接序列化为JSON的{}.
如何将一个类的对象进行序列化与反序列化。
json提供的dumps()与loads()
json.
dumps
(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
默认是utf-8编码
可选参数default
就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为需要转换的类对象
专门写一个转换函数,再把函数传进去即可:
def student2dict(std): return { 'name': std.name, 'age': std.age, 'score': std.score } print(json.dumps(s, default=student2dict))
json.dumps(需要转换的自定义类对象, default=lambda obj: obj.__dict__)
因为通常class
的实例都有一个__dict__
属性,它就是一个dict
,用来存储实例变量
def dict2student(d): return Student(d['name'], d['age'], d['score']) json_str = '{"age": 20, "score": 88, "name": "Bob"}' print(json.loads(json_str, object_hook=dict2student))
查看官网: