下面的数据类型可以用来打包:
l None,True,False
l 整数、浮点数、复数
l 字符串、bytes、bytearrays
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}}
本模块主要提供了一种方法:当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...
本模块主要提供了一种按字典的方法来保存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.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 深圳