您的位置:首页 > 其它

9.1.4 什么样数据类型可以打包和解包

2016-04-18 23:32 211 查看
下面的数据类型可以用来打包:l None,True,Falsel 整数、浮点数、复数l 字符串、bytes、bytearraysl 元组、列表、集合和字典等,不过要求这些容器只能包含可以被打包的类型对象。l 在模块顶层定义的函数,主要使用def定义的函数,非lambda定义。l 模块顶层定义的内置函数l 模块顶层定义的类l 有支持__dict__和___getstate__()可打包的实例。 例子:#python 3.4import pickle # 保存支持数据类型的对象data = { 'a': [1, 2.0, 3, 4+6j], 'b': ("character string", b"byte string"), 'c': set([None, True, False])} with open('data.pickle', 'wb') as f: # 使用最高协议版本来打包字典数据 pickle.dump(data, f, pickle.HIGHEST_PROTOCOL) data = Nonewith open('data.pickle', 'rb') as f: # 自动检查协议的版本号,不需要指定 data = pickle.load(f) print(data)结果输出如下:{'b': ('character string', b'byte string'), 'a': [1, 2.0, 3, (4+6j)], 'c': {None, True, False}}

9.2 copyreg--注册pickle打包时调用的函数

本模块主要提供了一种方法:当pickle打包某些对象时,可以调用指定的函数。同时在使用模块copy拷贝时也起作用。copyreg.constructor(object) 声明一个对象作为有效的构造函数调用,如果不是可调用的对象,就会抛出异常TypeError。 copyreg.pickle(type, function, constructor=None) 声明一个函数作为一个类型对象的构造函数。参数type是类型对象;参数function是将要被声明为构造函数。例子:#python 3.4import copyreg, copy, pickle class C(object): def __init__(self, a): self.a = a def pickle_c(c): print("打包C instance...") return C, (c.a,) copyreg.pickle(C, pickle_c)c = C(1)d = copy.copy(c)p = pickle.dumps(c)结果输出如下:打包C instance...打包C instance...

9.3 shelve--Python对象按字典方式保存到文件

本模块主要提供了一种按字典的方法来保存Python对象到文件。与数据库dbm相比,模块shelve的键值字段可以保存Python任何可以打包的对象,而数据库dbm不可以。 shelve.open(filename, flag='c', protocol=None, writeback=False) 打一个保存字典对象方式储存的文件,返回字典对象。参数filename是要保存或打开的文件名称;参数flag与dbm.open()函数里的参数一样;参数protocol是pickle协议的版本;参数writeback是指定是否缓存在内存,如果设置为True则缓存在内存里。 Shelf.sync() 如果打开文件时选择参数writeback为True时,调用本函数就会把缓存在内存里的数据写入文件。 Shelf.close() 把缓存里的数据同步到文件,同时把文件关闭。如果出错会抛出异常ValueError。 例子:#python 3.4import shelve d = shelve.open('data.txt')d['a1'] = 'http://blog.csdn.net/caimouse'd['a2'] = '大坡3D软件开发'd.close() f = shelve.open('data.txt')print(f['a2'])f.close()结果输出如下:大坡3D软件开发 蔡军生 QQ:9073204 深圳
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: