Python 序列化

秒速五厘米 2024-02-19 12:45 100阅读 0赞

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

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

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

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

Python提供两个模块来实现序列化:cPicklepickle。这两个模块功能是一样的,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢,跟cStringIOStringIO一个道理。用的时候,先尝试导入cPickle,如果失败,再导入pickle

  1. try:
  2. import cPickle as pickle
  3. except ImportError:
  4. import pickle
  5. pickle.dumps()方法把任意对象序列化成一个str,然后,就可以把这个str写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object
  6. f = open('dump.txt', 'wb')
  7. pickle.dump(d, f)
  8. f.close()

当我们要把对象从磁盘读到内存时,可以先把内容读到一个str,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:

  1. f = open('dump.txt', 'rb')
  2. d = pickle.load(f)
  3. f.close()
  4. d
  5. {'age': 20, 'score': 88, 'name': 'Bob'}

JSON:

1165439-20180208124043841-1410607278.png

Python内置的json模块提供了非常完善的Python对象到JSON格式的转换:

dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个file-like Object

要把JSON反序列化为Python对象,用loads()或者对应的load()方法,前者把JSON的字符串反序列化,后者从file-like Object中读取字符串并反序列化

  1. import json
  2. d = dict(name='Bob', age=20, score=88)
  3. json.dumps(d)
  4. #'{"age": 20, "score": 88, "name": "Bob"}'
  5. json_str = '{"age": 20, "score": 88, "name": "Bob"}'
  6. json.loads(json_str)
  7. #{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的对象,我们只需要为需要转换的类对象专门写一个转换函数,再把函数传进去即可:

  1. def student2dict(std):
  2. return {
  3. 'name': std.name,
  4. 'age': std.age,
  5. 'score': std.score
  6. }
  7. print(json.dumps(s, default=student2dict))
  8. json.dumps(需要转换的自定义类对象, default=lambda obj: obj.__dict__)

  因为通常class的实例都有一个__dict__属性,它就是一个dict,用来存储实例变量

  1. def dict2student(d):
  2. return Student(d['name'], d['age'], d['score'])
  3. json_str = '{"age": 20, "score": 88, "name": "Bob"}'
  4. print(json.loads(json_str, object_hook=dict2student))

  查看官网:

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

发表评论

表情:
评论列表 (有 0 条评论,100人围观)

还没有评论,来说两句吧...

相关阅读

    相关 序列,反序列

    序列化: 对象的序列化主要有两种用途:   1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;   2) 在网络上传送对象的字节序列。