博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python使用pickle,marshal进行序列化、反序列及JSON的使用
阅读量:6903 次
发布时间:2019-06-27

本文共 3163 字,大约阅读时间需要 10 分钟。

hot3.png

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.

代码示例

#!/usr/bin/python# encoding:utf-8import pickleimport marshalimport 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类,覆写相关方法,实现自定义对象的JSONclass 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 dclass 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 instP = {'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("================================")

参考

转载于:https://my.oschina.net/cloudcoder/blog/546074

你可能感兴趣的文章
sed-n/N/g/G/h/H/x…
查看>>
供应链管理-初见
查看>>
用 JavaScript 操作字符串
查看>>
Oracle计算时间差常用函数
查看>>
外链的理解
查看>>
机器学习:选对时机直线超车
查看>>
Java基础基本常识
查看>>
谈谈Python实战数据可视化之matplotlib模块(实战篇)
查看>>
2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理
查看>>
Java程序员需要技术能力达到什么程度,才能拿到月薪30k?
查看>>
Java之品优购课程讲义_day14(5)
查看>>
Jenkins 持续集成使用教程
查看>>
MongoDB复制集
查看>>
oracle sql
查看>>
强制弹出页面代码(以及自动最小化功能)
查看>>
关于Centos7无法连接网络,安装tree命令及修改ONBOOT选项后退出的程序!
查看>>
VRRP单备份配置
查看>>
好程序员学习笔记:函数
查看>>
如何打造工业物联网帝国?
查看>>
Linux系统安全之grub密码和用户权限
查看>>