5.21 序列化Python对象.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
5.21 序列化Python对象

5.21 序列化Python对象 问题 你需要将⼀个Python对象序列化为⼀个字节流,以便将它保存到⼀个⽂件、存储到数 据库或者 过⽹络传输它。 解决⽅案 对于序列化最普遍的做法就是使⽤ pickle 模块。为了将⼀个对象保存到⼀个⽂件 中,可以这样做: import pickle data = ... # Some Python object f = open(somefile, wb) pickle.dump(data, f) 为了将⼀个对象转储为⼀个字符串,可以使⽤ pickle.dumps() : s = pickle.dumps(data) 为了从字节流中恢复⼀个对象,使⽤ picle.load() 或 pickle.loads() 函数。 ⽐如: # estore from a file f = open(somefile, rb) data = pickle.load(f) # estore from a string data = pickle.loads(s) 讨论 对于⼤多数应⽤程序来讲,dump() 和 load() 函数的使⽤就是你有效使⽤ pickle 模块所需的全部了。它可适⽤于绝⼤部分Python数据类型和⽤户⾃定义类的对象实 例。如果你碰到某个库可以让你在数据库中保存/恢复Python对象或者是 过⽹络传输 对象的话,那么很有可能这个库的底层就使⽤了 pickle 模块。 pickle 是⼀种Python特有的⾃描述的数据编码。 过⾃描述,被序列化后的数据包 含每个对象开始和结束以及它的类型信息。因此,你⽆需担⼼对象记录的定义,它总 是能⼯作。举个例⼦,如果要处理多个对象,你可以这样做: import pickle f = open(somedata, wb) pickle.dump([1, 2, 3, 4], f) pickle.dump(hello, f) pickle.dump({Apple, Pear, Banana}, f) f.close() f = open(somedata, rb) pickle.load(f) [1, 2, 3, 4] pickle.load(f) hello pickle.load(f) {Apple, Pear, Banana} 你还能序列化函数,类,还有接⼜,但是结果数据仅仅将它们的名称编码成对应的代 码对象。例如: import math import pickle. pickle.dumps(math.cos) b\x80\x03cmath\ncos\nq\x00. 当数据反序列化回来的时候,会先假定所有的源数据时可⽤的。模块、类和函数会⾃ 动按需导⼊进来。对于Python数据被不同机器上的解析器所共享的应⽤程序⽽⾔,数 据的保存可能会有问题,因为所有的机器都必须访问同⼀个源代码。 注 千万不要对不信任的数据使⽤pickle.load()。 pickle在加载时有⼀个副作⽤就是它会⾃动加载相应模 并构造实例对象。 但是某个坏⼈如果知道pickle的⼯作原理, 他就可以创建⼀个恶意的数据导致Python执⾏随意指定的系统命令。 因此,⼀定要保证pickle只在相互之间可以认证对⽅的解析器的内部使⽤。 有些类型的对象是不能被序列化的。这些 常是那些依赖外部系统状态的对象, ⽐如 打开的⽂件,⽹络连接,线程,进程,栈帧等等。 ⽤户⾃定义类可以 过提供 __getstate__() 和 __setstate__() ⽅法来绕过这些限制。 如果定义了这两个 ⽅法,pickle.dump() 就会调⽤ __getstate__() 获取序列化的对象。 类似 的,__setstate__() 在反序列化时被调⽤。为了演⽰这个⼯作原理, 下⾯是⼀个 在内部定义了⼀个线程但仍然可以序列化和反序列化的类: # countdown .py import time import threading class Countdown: def __init__(self, n): self.n = n self.thr = threading.Thread(target=self.run) self.thr.daemon = True self.thr.start() def run(self): while self.n

文档评论(0)

ipbohn97 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档