• 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

  • 相关阅读:
    hadoop配置支持LZO压缩格式并支持分片
    CSS 图片:如何使用 CSS 来布局图片
    CSS3 用户界面:用户界面特性来调整元素尺寸,框尺寸和外边框
    CSS3 多列:如何将文本内容设计成像报纸一样的多列布局?
    mac Pycharm:如何使用anaconda安装jieba
    pycharm如何安装jieba词频统计器?
    CSS3 动画:使元素从一种样式逐渐变化为另一种样式的效果
    CSS3 过渡:用鼠标移过逐渐改变它原有样式
    CSS3 3D 转换:使用 3D 转换来对元素进行格式化
    CSS3 2D 转换:对元素进行移动、缩放、转动、拉长或拉伸
  • 原文地址:https://www.cnblogs.com/likeyou1/p/8431087.html
Copyright © 2020-2023  润新知