最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • pickle和cPickle:Python对象的序列化

    目的:Python对象序列化
    可用性:pickle最少1.4版本,cPickle 1.5版本以上


    pickle模块实现了1种算法,将任意1个Python对象转化成1系列字节(byets)。此进程也调用了serializing对象。代表对象的字节流以后可以被传输或存储,再重构后创建1个具有相同特点(the
    same characteristics)的新的对象。

    cPickle使用C而不是Python,实现了相同的算法。这比Python实现要快好几倍,但是它不允许用户从Pickle派生子类。如果子类对你的使用来讲无关紧要,那末cPickle是个更好的选择。

    正告:本文档直接说明,pickle不提供安全保证。如果你在多线程通讯(inter-process communication)或数据存储或存储数据中使用pickle,1定要谨慎。请勿信任你不能肯定为安全的数据。

    导入

    如平常1样,尝试导入cPickle,给它赋予1个别名“pickle”。如果由于某些缘由导入失败,退而求其次到Python的原生(native)实现pickle模块。如果cPickle可用,能给你提供1个更快速的履行,否则只能是轻便的履行(the portable implementation)。

    try:
    import cPickle as pickle
    except:
    import pickle

    编码和解码

    第1个例子将1种数据结构编码成1个字符串,然后把该字符串打印至控制台。使用1种包括所有原生类型(native types)的数据结构。任何类型的实例都可被腌渍(pickled,译者注:模块名称pickle的中文含义为腌菜),在稍后的例子中会演示。使用pickle.dumps()来创建1个表示该对象值的字符串。

    try:
    import cPickle as pickle
    except:
    import pickle
    import pprint

    data = [ { 'a':'A', 'b':2, 'c':3.0 } ]
    print 'DATA:',
    pprint.pprint(data)

    data_string = pickle.dumps(data)
    print 'PICKLE:', data_string

    pickle默许仅由ASCII字符组成。也能够使用更高效的2进制格式(binary format),只是由于在打印的时候更容易于理解,本页的所有例子都使用ASCII输出。

    $ python pickle_string.py

    DATA:[{'a': 'A', 'b': 2, 'c': 3.0}]
    PICKLE: (lp1
    (dp2
    S'a'
    S'A'
    sS'c'
    F3
    sS'b'
    I2
    sa.

    数据被序列化以后,你可以将它们写入文件、套接字、管道等等中。以后你也能够从文件中读取出来、将它反腌渍(unpickled)而构造1个具有相同值得新对象。

    try:
    import cPickle as pickle
    except:
    import pickle
    import pprint

    data1 = [ { 'a':'A', 'b':2, 'c':3.0 } ]
    print 'BEFORE:',
    pprint.pprint(data1)

    data1_string = pickle.dumps(data1)

    data2 = pickle.loads(data1_string)
    print 'AFTER:',
    pprint.pprint(data2)

    print 'SAME?:', (data1 is data2)
    print 'EQUAL?:', (data1 == data2)

    如你所见,这个新构造的对象与原对象相同,但并不是同1对象。这不足为奇。

    $ python pickle_unpickle.py

    BEFORE:[{'a': 'A', 'b': 2, 'c': 3.0}]
    AFTER:[{'a': 'A', 'b': 2, 'c': 3.0}]
    SAME?: False
    EQUAL?: True

    与流1起工作

    dumps()loads()外,pickle还提供1对用在类文件流(file-like
    streams)的转化函数。可以往1个流中写对个对象,然后从流中把它们读取出来,此进程不需要预先写入的对象有几个、它们多大。

    try:
    import cPickle as pickle
    except:
    import pickle
    import pprint
    from StringIO import StringIO

    class SimpleObject(object):

    def __init__(self, name):
    self.name = name
    l = list(name)
    l.reverse()
    self.name_backwards = ''.join(l)
    return

    data = []
    data.append(SimpleObject('pickle'))
    data.append(SimpleObject('cPickle'))
    data.append(SimpleObject('last'))

    # 使用StringIO摹拟1个文件
    out_s = StringIO()

    # 写入该流
    for o in data:
    print 'WRITING: %s (%s)' % (o.name, o.name_backwards)
    pickle.dump(o, out_s)
    out_s.flush()

    # 建立1个可读流
    in_s = StringIO(out_s.getvalue())

    # 读数据
    while True:
    try:
    o = pickle.load(in_s)
    except EOFError:
    break
    else:
    print 'READ: %s (%s)' % (o.name, o.name_backwards)

    这个例子使用SringIO缓存器(buffer)摹拟流,所以在建立可读流的时候我们玩了1把。1个简单数据库的格式化也能够使用pickles来存储对象,只是shelve与之工作更加简便。

    $ python pickle_stream.py

    WRITING: pickle (elkcip)
    WRITING: cPickle (elkciPc)
    WRITING: last (tsal)
    READ: pickle (elkcip)
    READ: cPickle (elkciPc)
    READ: last (tsal)

    除存储数据,pickles在进程间通讯(inter-process communication)中也非常称手。例如,使用os.fork()os.pipe()可以创建工作者进程(worker
    processes),从1个管道(pipe)读取作业指令(job instruction)然后将结果写入另外一个管道。管理工作者池(worker pool)和将作业送入、接受响应(response)的核心代码可被重用,由于作业和响应其实不属于某个特定类中。如果你使用管道或套接字(sockets),在通过连至另外一端(end)的连接倾倒(dumps)所有对象、推送数据以后,别忘了冲洗(flush)。如果你想写自己的工作者池管理器,请看multiprocessing

    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » pickle和cPickle:Python对象的序列化

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级