云学python (第5章对象带你飞之储存 上下文管理器pickle 包)《vamei-从Python开始学编程》 笔记

2023-10-27

2.上下文管理器

文件操作常常和上下文管理器一起使用。上下文管理器(context manager)用于规定某个对象的使用范围。一旦进入或者离开该使用范围, 则会有特殊操作被调用,比如为对象分配或者释放内存。 

下面是一段常规的文件操作程序:

#常规文件操作

f = open('/Users/huaweimatebook16/python入门/text2.txt','w')
f.write('I like apple iii\n''sss\n')
f.close()
f = open('/Users/huaweimatebook16/python入门/text2.txt','r')
content = f.readlines()
print(content)
f.close()
print(f.closed)

如果我们加入上下文管理器的语法,就可以把程序改写为:

#使用上下文管理器

with open('/Users/huaweimatebook16/python入门/text2.txt','w')as f:
    f.write("Hello World!")

print(f.closed)

第二段程序就使用了 with...as...结构。上下文管理器有隶属于它的程序块,当隶属的程序块执行结束时,也就是语句不再缩进时,上下文管理器就会自动关闭文件。对于复杂的程序来说,缩进的存在能让程序员更清楚地意识到文件在哪些阶段打开,减少忘记关闭文件的可能性。

上面的上下文管理器基于f对象的__exit__()特殊方法。使用上下文管理器的语法时,Python会在进入程序块之前调用文件对象的__enter__() 方法,在结束程序块的时候调用文件对象的__exit__()方法。在文件对象 的__exit___()方法中,有self.close()语句。

任何定义了 __enter__()方法和__exit__()方法的对象都可以用于上下文管理器。

下面自定义一个类Vow,并定义它的__enter__()方法和__exit__()方法。因此,由Vow类的对象可以用于上下文管理器:

class Vow(object):
    def __init__(self,text):
        self.text=text
    def __enter__(self):
        self.text = "I say: " + self.text
        return self
    def __exit__(self,exc_type,exc_value,traceack):
        self.text = self.text + "!!"
with Vow("I'm fine") as myvow:
    print(myvow.text)
print(myvow.text)
______________________
#结果I say: I'm fine
#结果I say: I'm fine!!

初始化对象时,对象的text属性是“I'm fine”,在进入上下文和离开上下文时,对象调用了__enter__()方法和__exit__()方法,从而造成对象的text属性改变。

__enter__()返回一个对象。上下文管理器会使用这一对象作为as所指的变量。自定义的__enter__()返回的是self,也就是新建的Vow类对象本身。在__enter__()中,我们为text属性增加了前缀“I say: ”在__exit__中,我们为text属性增加了后缀“!”。

__exit__()有四个参数。当程序块中出现异常时, __exit__()参数中exc_value,exc_value,traceack用于描述异常,可以根据这三个参数进行相应的处理。如果正常运行结束,则这三个参 数都是None。

3. pickle 

利用Pythonpickle包就可以做到把对象保存到磁盘上。英文里,pickle是腌菜的意思。大航海时代的海员们常把蔬菜做成腌菜,装在罐头里带着走。Python中的pickle也有类似的意思

实际上,对象的存储分为两步。第一步,将对象在内存中的数据直接抓取出来,转换成一个有序的文本,即所谓的序列化(Serialization)第二步,将文本存入文件。等到需要时,从文件中读出文本,再放入内存,就可以获得原有的对象。

下面是一个具体的例子,首先是第一步序列化,将内存中的对象转换为文本流:

import pickle

class Bird(object):
    have_feather = True
    reproduction_method = "egg"
summer = Bird()
pickle_string= pickle.dumps(summer)

with open('summer.pickle','wb')as f:
    f.write(pickle_string )
print(pickle_string)

使用pickle包的dump()方法可以将对象转换成字符串的形式。随后用字节文本的存储方法,将该字符串储存在文件。

import pickle
class Bird(object):
    have_feather = True
    reproduction_method = "egg"
summer = Bird()
with open("summer.pkl","wb") as f:
    pickle.dump(summer,f)

对象summer将存储在文件summer.pkl中。

读取对象与存储对象的过程正好相反。首先,从文件中读出文本。然后使用pickleloads()方法,将字符串形式的文本转换为对象。

有时候,仅仅是反向恢复还不够。对象依赖于它的类,所以Python 在创建对象时,需要找到相应的类所以从文本中读取对象时,程序屮必须已经定义过类。

Python总是存在的内置类,如列表、词 典、字符串等,不需要再在程序中定义。但对于用户自定义的类,就必须要先定义类,然后才能从文件中载入该类的对象。

下面是一个读取对象的例子:

import pickle
class Bird(object):
    have_feather = True
    reproduction_method = "egg"
with open("summer.pkl","rb")as f:
    summer = pickle.load(f)
print(summer.have_feather)
_____________
True


​​​​​​​

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

云学python (第5章对象带你飞之储存 上下文管理器pickle 包)《vamei-从Python开始学编程》 笔记 的相关文章

随机推荐

  • 域名解析问题记录

    链接vpn之后发现不能上网 域名解析不了 1 查看域名能否解析 nslookup baidu com 2 添加114一行 这是国内的域名解析服务器 sudo vim etc resolv conf sangfor dns client na
  • 表白墙程序

    目录 一 页面代码部分 二 设计程序 二 实现 doPost 编辑 三 实现 doGet 四 前端代码部分 五 使用数据库存储数据 一 页面代码部分 在之前的一篇博客中 已经写过了表白墙的页面代码实现 这里就不再重复了 页面代码如下 div
  • 大数据技术:Spark相关问题汇总

    问题导读 1 Spark有几种部署方式 请分别简要论述 2 Spark任务使用什么方式进行任务提交 3 Spark常用算子reduceByKey与groupByKey的区别 哪一种更具优势 4 简述SparkSQL中RDD DataFram
  • Spring源码(十六)bean实例化过程CreateBeanInstance方法

    Spring源码 十六 bean实例化过程CreateBeanInstance方法 实例化过程以及创建对象的方式 总结 实例化过程以及创建对象的方式 protected Object doCreateBean String beanName
  • java之socket的OOBInline和UrgentData和发送心跳包研究

    UrgentData可以理解为紧急发送数据方式 如果我们客户端先用write方法写入数据 再用UrgentData发送数据 再去执行flush操作 我们可以得到服务端先打印UrgentData发送的数据 然后再打印write写入的数据 客户
  • 注意力提高神经回路的突触功效和信噪比(Farran Briggs, George R. Mangun& W. Martin Usrey)

    注意力是知觉的一个重要组成部分 然而 注意调节神经沟通来指导行为的机制却知之甚少 为了阐明注意力的突触机制 我们开发了一种神经沟通注意调节的敏感测定 在执行视觉空间注意任务的警戒键中 我们通过电刺激丘脑外侧膝状体神经元中的神经元 同时记录来
  • 我为什么鼓励你读计算机博士

    看过 水浒传 的朋友都知道 梁山的一百单八将因为各种理由加入了水寨 走上了劫富济贫 替天行道的路 我2006年从南京大学本科毕业以后 耳闻目睹了数百位计算机专业的博士 生 他们选择读博士的理由可以说比梁山好汉更为复杂 gt gt gt gt
  • 企业运维实战--ELK日志分析平台之elasticsearch实战

    企业运维实战 ELK日志分析平台之elasticsearch实战 ELK日志分析平台 简介 安装elasticsearch elasticsearch集群部署 为集群添加监控管理 监控1 监控2 ELK日志分析平台 简介 ELK由Elast
  • Python 元类实现ORM

    目录 ORM概念 new init call 的介绍 通过元类简单实现ORM中的insert功能 抽取到基类中 ORM概念 ORM Object Ralational Mapping 对象关系映射 用来把对象模型表示的对象映射到基于 SQL
  • 基于51单片机的电烤箱微波炉数码管显示proteus仿真

    硬件设计 MCU基于51单片机 ADC采用TLC2543 芯片简介如下 1 12位分辩率A D转换器 2 在工作温度范围内10 s转换时间 3 11个模拟输入通道 4 3路内置自测试方式 5 采样率为66kbps 6 线性误差 1LSBma
  • 解决Windows提示缺少mfc140.dll文件的问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个mfc140 dll文件进行安装 前提是找到适合
  • Ant Design Vue(2.2.8) 组件样式覆盖 -- 非弹窗和弹窗 -- 全局非全局

    1 简单覆盖 非弹窗 deep 类名 div class deviceFirmManage common box div class search box div div
  • 动态通讯录

    目录 1 修改联系人结构体 2 修改初始化功能 3 增加判断通讯录是否需要扩容 4 修改删除功能 在静态内存的基础之上 我们试着用动态内存开辟空间的方式去修改通讯录 动态通讯录是对静态通讯录的补充 只需要修改部分代码就可行 1 修改联系人结
  • 人工智能中蕴含的情商

    古语云 人之初 性本善 性相近 习相远指的是生于天地之间的为人处事之道 善良并不意味着胆小与懦弱 格物斯坦认为善良的人往往具有较高的情商和组织协调能力 善待世间的一切天地万物 一切是非恩怨 一切明争暗斗 且听吾分析到来 有句话是这样说的 情
  • Building an MFC project for a non-Unicode character set is deprecated

    VS2013多字节工程问题 使用VS2013编译旧版VC 程序时 提示Building an MFC project for a non Unicode character set is deprecated 微软提供了解决方案 一 错误信
  • 关于cmake qmake make makeile之间的关系问题

    总之 qmake是根据 pro文件生成makefile文件 同理cmake是根据CMakeList txt生成的makefile文件 make再根据makefile文件来编译工程文件 来完成 预编译 gt 编译 gt 汇编 gt 链接 中的
  • 使用命令行将Windows上的Git升级到最新版本

    关于Git的命令有很多 这里简单说一下和版本升级有关的几条吧 查看版本信息 git version 在2 14 2和2 16 1之间的版本中 命令是git update 从Git 2 16 1开始 您可以使用git update git f
  • Struts2中关于"There is no Action mapped for namespace / and action name"的总结

    参考 http www cnblogs com gulvzhe archive 2011 11 21 2256632 html 今天在调试一个基础的Struts2框架小程序 总是提示 There is no Action mapped fo
  • 深度学习六、图像风格迁移

    所谓图像风格迁移 是指利用算法学习著名画作的风格 然后再把这种风格应用到另外一张图片上的技术 1 图像风格迁移的原理 在学习原始的图像风格迁移之前 可以先回忆一下ImageNet图像识别模型VGGNet 事实上 可以这样理解VGGNet的结
  • 云学python (第5章对象带你飞之储存 上下文管理器pickle 包)《vamei-从Python开始学编程》 笔记

    2 上下文管理器 文件操作常常和上下文管理器一起使用 上下文管理器 context manager 用于规定某个对象的使用范围 一旦进入或者离开该使用范围 则会有特殊操作被调用 比如为对象分配或者释放内存 下面是一段常规的文件操作程序 常规