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

来源:互联网 发布:面试淘宝运营技巧 编辑:程序博客网 时间:2024/06/06 08:33

下面的数据类型可以用来打包:

l NoneTrueFalse

l 整数、浮点数、复数

l 字符串、bytesbytearrays

l 元组、列表、集合和字典等,不过要求这些容器只能包含可以被打包的类型对象。

l 在模块顶层定义的函数,主要使用def定义的函数,非lambda定义。

l 模块顶层定义的内置函数

l 模块顶层定义的类

l 有支持__dict_____getstate__()可打包的实例。

 

例子:

#python 3.4

import 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 = None

with 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.4

import 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是要保存或打开的文件名称;参数flagdbm.open()函数里的参数一样;参数protocolpickle协议的版本;参数writeback是指定是否缓存在内存,如果设置为True则缓存在内存里。

 

Shelf.sync()

如果打开文件时选择参数writebackTrue时,调用本函数就会把缓存在内存里的数据写入文件。

 

Shelf.close()

把缓存里的数据同步到文件,同时把文件关闭。如果出错会抛出异常ValueError

 

例子:

#python 3.4

import 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 深圳

0 0
原创粉丝点击