前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python使用pickle,marshal进行序列化、反序列及JSON的使用

python使用pickle,marshal进行序列化、反序列及JSON的使用

原创
作者头像
用户7718188
修改2021-11-02 14:07:20
8820
修改2021-11-02 14:07:20
举报
文章被收录于专栏:高级工程司高级工程司

Pickle序列化

        python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象

JSON(JavaScript Object Notation) 

        json是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

marshal

        marshal并不是一个通用的模块,在某些时候它是一个不被推荐使用的模块,因为使用marshal序列化的二进制数据格式还没有文档 化,在不同版本的Python中,marshal的实现可能不一样。也就是说,用python2.5序列为一个对象,用python2.6的程序反序列化 所得到的对象,可能与原来的对象是不一样的。但这个模块存在的意义,正如Python手册中所说:The marshal module exists mainly to support reading and writing the “pseudo-compiled” code for Python modules of .pyc files.

代码示例

代码语言:javascript
复制
#!/usr/bin/python
# encoding:utf-8

import pickle
import marshal
import json

#创建一个对象
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def sayHi(self):
        print 'Hello, my name is', self.name

#继承JSONEncoder和JSONDecoder类,覆写相关方法,实现自定义对象的JSON
class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        # convert object to a dict
        d = {}
        d['__class__'] = obj.__class__.__name__
        d['__module__'] = obj.__module__
        d.update(obj.__dict__)
        return d


class MyDecoder(json.JSONDecoder):
    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=self.dict2object)

    def dict2object(self, d):
        # convert dict to object
        if '__class__' in d:
            class_name = d.pop('__class__')
            module_name = d.pop('__module__')
            module = __import__(module_name)
            class_ = getattr(module, class_name)
            args = dict((key.encode('ascii'), value) for key, value in d.items())  # get args
            inst = class_(**args)  # create new instance
        else:
            inst = d
        return inst

P = {'B': -0.26268660809250016,
     'E': -3.14e+100,
     'M': -3.14e+100,
     'S': -1.4652633398537678}

def testPickle():
    p1 = Person("Tom", 10)
    p1.sayHi()

    outFile = open("p.p", 'wb')
    pickle.dump(p1, outFile, 1);
    outFile.close()

    inFile = open("p.p", 'rb')
    p2 = pickle.load(inFile)
    inFile.close()
    p2.sayHi()


def testMarshal():
    outFile = open("p.p", 'wb')
    marshal.dump(P, outFile);
    outFile.close()

    start_p = {}
    with open('p.p', 'rb') as f:
        start_p = P
    for a in start_p:
        print(start_p[a])

#测试处理普通的python内置类型
def testJson():
    obj = [[1, 2, 3], 123, 123.123, 'abc', {'key1': (1, 2, 3), 'key2': (4, 5, 6)}]
    encodedjson = json.dumps(obj)
    print repr(obj)
    print encodedjson

    decodejson = json.loads(encodedjson)
    print type(decodejson)
    print decodejson[4]['key1']
    print decodejson

#测试处理自定义类型
def testJsonObj():
    p = Person("Tom", 10)
    d = MyEncoder().encode(p)
    o = MyDecoder().decode(d)

    print d
    print type(o), o
    o.sayHi()

if __name__ == '__main__':
    testPickle()
    print("================================")
    testMarshal()
    print("================================")
    testJson()
    print("================================")
    testJsonObj()
    print("================================")

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pickle序列化
  • JSON(JavaScript Object Notation) 
  • marshal
  • 代码示例
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档