Python 序列化

在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:

d = dict(name='Bob', age=20, score=88)

序列化就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

Python提供两个模块来实现序列化:cPicklepickle。这两个模块功能是一样的,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢,跟cStringIOStringIO一个道理。用的时候,先尝试导入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(objskipkeys=Falseensure_ascii=Truecheck_circular=Trueallow_nan=Truecls=Noneindent=Noneseparators=Noneencoding="utf-8"default=Nonesort_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))

  查看官网:

https://docs.python.org/2/library/json.html#json.dumps

原文地址:https://www.cnblogs.com/likeyou1/p/8431087.html