- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- JTG-T-5190-2019农村公路养护技术规范.docx VIP
- 2020 ACLS-PC-SA课前自我测试试题及答案.doc
- 房产勘察与带看.ppt VIP
- 学习小窍门教案 .pdf VIP
- PLA 检测在急性脑梗死诊断中的应用-来源:现代养生(下半月版)(第2019007期)-河北省医疗气功医院.pdf VIP
- 公司法修订背景下禁止财务资助规则的构建与完善.docx VIP
- 农光互补发电项目开发政策梳理.docx
- 城市轨道交通车辆检修(高职)全套教学课件.pptx
- 2024-2025年《国有企业管理人员处分条例》考试题库测试题目竞赛试卷2份(有答案).pdf VIP
- ATV630_650变频器编程手册.pptx VIP
文档评论(0)