IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    caimouse发表于 2016-04-18 23:32:58
    love 0

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

    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}}

     


    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是要保存或打开的文件名称;参数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 深圳



沪ICP备19023445号-2号
友情链接