• 读文件
man = []
other = []try:data = open('sketch.txt')for each_line in data:try:(role, line_spoken) = each_line.split(':', 1)# 删除line_spoken中不需要的空白符line_spoken = line_spoken.strip()# 如果时Man说的话,加到man列表中if role == 'Man':man.append(line_spoken)# 如果时Other Man说的话,加到other列表中elif role == 'Other Man':other.append(line_spoken)except ValueError:passprint('man[] = ', end='')print(man)print('other[] = ', end='')print(other)data.close()
except IOError:print('the file is missing!')

  • 写文件
man = []
other = []try:data = open('sketch.txt')for each_line in data:try:(role, line_spoken) = each_line.split(':', 1)# 删除line_spoken中不需要的空白符line_spoken = line_spoken.strip()# 如果时Man说的话,加到man列表中if role == 'Man':man.append(line_spoken)# 如果时Other Man说的话,加到other列表中elif role == 'Other Man':other.append(line_spoken)except ValueError:passprint('man[] = ', end='')print(man)print('other[] = ', end='')print(other)data.close()
except IOError:print('the file is missing!')# 使用访问模式w时, Python会打开指定的文件来完成写,
# 如果文件已存在则清空现有内容,
# 如果不存在则先创建文件
out = open('man.out', 'w')
print(man, file=out)# 关闭文件,相当于刷新(flushing)
out.close()

  • 写覆盖
man = []
other = []try:data = open('sketch.txt')for each_line in data:try:(role, line_spoken) = each_line.split(':', 1)# 删除line_spoken中不需要的空白符line_spoken = line_spoken.strip()# 如果时Man说的话,加到man列表中if role == 'Man':man.append(line_spoken)# 如果时Other Man说的话,加到other列表中elif role == 'Other Man':other.append(line_spoken)except ValueError:passprint('man[] = ', end='')print(man)print('other[] = ', end='')print(other)data.close()
except IOError:print('the file is missing!')# 使用访问模式w时, Python会打开指定的文件来完成写,
# 如果文件已存在则清空现有内容,
# 如果不存在则先创建文件
out = open('man.out', 'w')
print(man, file=out)# 关闭文件,相当于刷新(flushing)
out.close()outother = open('man.out', 'w')
print(other, file=outother)
outother.close()

  • 写追加
# !/usr/bin/env python
# -*- coding: utf-8 -*-
man = []
other = []try:data = open('sketch.txt')for each_line in data:try:(role, line_spoken) = each_line.split(':', 1)# 删除line_spoken中不需要的空白符line_spoken = line_spoken.strip()# 如果时Man说的话,加到man列表中if role == 'Man':man.append(line_spoken)# 如果时Other Man说的话,加到other列表中elif role == 'Other Man':other.append(line_spoken)except ValueError:passprint('man[] = ', end='')print(man)print('other[] = ', end='')print(other)data.close()
except IOError:print('the file is missing!')try:# 使用访问模式w时, Python会打开指定的文件来完成写,# 如果文件已存在则清空现有内容,# 如果不存在则先创建文件out = open('man.out', 'w')print(man, file=out)# 关闭文件,相当于刷新(flushing)out.close()other_data = open('man.out', 'a')print(other, file=other_data)other_data.close()
except:print('File error')
  • 这里其实还存在一个小问题,我在写文件时,捕获了IOError,这会不会对代码造成影响呢?我们现在都知道在进行文件操作时需要捕获IORError,需要关闭文件,但是,如果在print时出现一个IOError,程序会怎么处理?后面的代码还会执行吗?文件还会关闭吗?答案时肯定不会的,所以我们需要新的机制,在捕获异常时,必须有一段代码是一定能够执行的,不被异常捕获而中断。
  • 用finally扩展try
# !/usr/bin/env python
# -*- coding: utf-8 -*-
man = []
other = []try:data = open('sketch.txt')for each_line in data:try:(role, line_spoken) = each_line.split(':', 1)# 删除line_spoken中不需要的空白符line_spoken = line_spoken.strip()# 如果时Man说的话,加到man列表中if role == 'Man':man.append(line_spoken)# 如果时Other Man说的话,加到other列表中elif role == 'Other Man':other.append(line_spoken)except ValueError:passprint('man[] = ', end='')print(man)print('other[] = ', end='')print(other)data.close()
except IOError:print('the file is missing!')try:# 使用访问模式w时, Python会打开指定的文件来完成写,# 如果文件已存在则清空现有内容,# 如果不存在则先创建文件out = open('man.out', 'w')print(man, file=out)other_data = open('man.out', 'a')print(other, file=other_data)except IOError:print('File error')finally:# 关闭文件,相当于刷新(flushing)out.close()other_data.close()
  • 在出现异常时,先执行finally代码块,然后才会终止程序,这样文件就不会因为出现异常而无法关闭。finall代码块是一段进入try代码块后一定会执行的部分。
  • 在这里我们直接调用的关闭方法,可是当文件不存在时,是否还能直接调用关闭呢?

  • 当文件不存在时,数据文件对象并未创建,这样就不可能再数据对象上调用close()方法,所以出现一个NameError错误。

  • 这里会再locals()BIF返回的集合中搜索字符串data,如果找到,可以认为文件成功打开
  • 这里只返回了File Error,可是我们却并不清楚是什么导致了这个错误,那么我们是否可以得到具体的错误信息呢?

  • 为异常对象给定一个名,然后作为错误消息的一部分
  • 这里要注意err是一个异常对象,并不能和字符串相连接,故需要强制类型转换str(err)
  • 用with处理文件
  • 由于处理文件时 try/except/finally非常常用,所以Python提供了一个语句来抽象出相关的一些细节。对文件使用with语句时,with可以妥善地关闭一个可能打开的数据文件,而不需要finally代码块
man = []
other = []try:with open('sketch.txt') as data:for each_line in data:try:(role, line_spoken) = each_line.split(':', 1)# 删除line_spoken中不需要的空白符line_spoken = line_spoken.strip()# 如果时Man说的话,加到man列表中if role == 'Man':man.append(line_spoken)# 如果时Other Man说的话,加到other列表中elif role == 'Other Man':other.append(line_spoken)except ValueError as verr:print('Value Error: ' + str(verr))pass
except IOError as err:print('File Error: ' + str(err))try:with open('man_data.txt', 'w') as man_file:print(man, file=man_file)with open('other_data.txt', 'w') as other_file:print(other, file=other_file)
except IOError as err:print('File Error: ' + str(err))
  • 读取我们存储的文件内容,print到屏幕

  • 数据没有格式,完全是列表储方式的输出
  • 怎样格式化内容呢?存储时格式化还是读取时格式化?
  • 读取时再格式化当然是可以的,但这需要大量的额外逻辑,另外,如果是一个协作项目,与你对接的人怎么知道你的文件内容,该怎样格式化呢?所以我们可能需要把数据存储成一种更容易解析的格式
  • 腌制数据
  • Python提供了一个标准库, 名为pickle,它可以保存和加载任何python数据对象,包括列表
  • 一旦把某个数据“腌制”到一个文件,它将会持久存储,可以在以后某个时间都入到另外一个程序。
  • 用dump保存,用load恢复
  • 使用pickle只需导入所需的模块,处理数据的唯一要求是必须以二进制模式打开这些文件
  • dump“腌制”数据
import pickleman = []
other = []try:with open('sketch.txt') as data:for each_line in data:try:(role, line_spoken) = each_line.split(':', 1)# 删除line_spoken中不需要的空白符line_spoken = line_spoken.strip()# 如果时Man说的话,加到man列表中if role == 'Man':man.append(line_spoken)# 如果时Other Man说的话,加到other列表中elif role == 'Other Man':other.append(line_spoken)except ValueError as verr:print('Value Error: ' + str(verr))pass
except IOError as err:print('File Error: ' + str(err))try:with open('man_data.txt', 'wb') as man_file:pickle.dump(man, man_file)with open('other_data.txt', 'wb') as other_file:pickle.dump(other, other_file)
except IOError as err:print('File Error: ' + str(err))

  • ????pickle的数据存储的是个什么鬼?不用担心,它本来就是这个样子。python的pickle使用了一种定制的二进制格式。
  • 然后尝试把它读出来

  • 大功告成
  • 使用pickle的通用文件I/O才是上策
  • Python负责你的文件I/O细节,这样你就可以重点关注你的代码实际做什么或者需要做什么
  • BULLET POINTS
  1. “不可变类型” Python中的一些数据类型,一旦赋值,这个值就不能在改变。例如:name = 'zhangsan'   name = 'lisi'这两行代码看似修改name字符串的值,实际上name的值确实改变了,变成了lisi,但是之前的‘zhangsan’的内容并没有改变。name变量只是从指向‘zhangsan’变成了指向‘lisi’,即name='lisi'实际是做了两件事:1.新建了一个‘lisi’的字符串 2.name指向‘lisi’
  2. Python变量只包含数据对象的一个引用,数据对象才真正包含数据。
  3. print(value, sep=' ', end='\n', file=sys.stdout)默认地BIF会显示到屏幕(sys.stdout),这个file参数是第四个位置参数,不过,如果想把数据输出到屏幕以外的地方,也不必为第二个或者第三个位置的参数提供值,因为他们也有缺省值。也就是说Python是根据参数名定位参数,跟位置无关,不像其他语言那样直接传递参数就行,而需要连要传递的参数名一起写全。例如,print('name', end='')以‘’空串结尾,不换行。这里就把end=也写上了。
  4. “腌制”是将数据对象保存到一个持久存储中的过程。
  5. “解除腌制”是从持久存储中恢复一个已保存的数据对象的过程。
  6. strip()方法可以从字符串去除不想要的空白符。
  7. finally组总会执行, 而不论try/except语句中发生什么异常。
  8. locals()BIF返回当前作用域中的变量集合。
  9. in操作符用于检查成员关系。
  10. with语句会自动处理所有一代开文件的关闭操作,即使出现遗产个也不例外。with语句也使用as关键字。
  11. 标准库的pickle允许你容易而高效地将Python数据对象保存到磁盘以及从磁盘恢复。
  12. pickle.dump()将数据保存到磁盘。
  13. pickle.load()从磁盘恢复数据。

《Head First Python》第四章--持久存储相关推荐

  1. 《Head First Python》笔记 第四章 持久存储

    2019独角兽企业重金招聘Python工程师标准>>> 感觉比Java简单许多啊... 持久存储 Persistent:Saving data to file 将基于内存的数据存储到 ...

  2. 【python第四章——序列(列表、元组、字典、集合、字符串、正则)】

    python第四章--序列 第四章--序列 4.1列表 4.2元组 4.3字典 4.4集合 4.5字符串(重要) 4.6正则表达式 第四章--序列 概念:序列指一块可存放多个值的连续内存空间,这些值按 ...

  3. Python(第四章) 序列的应用

    第四章 本章概览 在Python中序列是最基本的数据结构.它是一块用于存放多个值的连续内存空间.Python中内置了5个常用的序列结构,分别是:列表.元组.集合.字典.字符串,本章详细讲解列表.元组. ...

  4. Python第四章-字典

    第四章 字典-当索引不好用时 4.0     字典可以理解成是C++里的map,可以映射任何类型.字典这种结构类型称为映射(mapping).   字典是Python中唯一内建的映射类型,字典中的值并 ...

  5. 浙江大学pta答案python第四章_浙大PTA-Python题库 编程题第一章(1-1~1-3)题解

    其他各章题解链接如下 浙大PTA-Python题库 编程题第一章(1-1~1-3)题解 https://blog.csdn.net/zimuzi2019/article/details/1070206 ...

  6. python第四章课后答案4.7_Python数据分析实战作业 第四章 Python数据分析实战 习题...

    第四章 Python数据分析实战 习题(数据见附件sizhang.xlsx) 班主任现有一班级的两张表,如下. 表一:成绩表 学 号C#线 代Python 16010203788896 表二:信息表 ...

  7. Python第四章课后练习

    练习4-1:比萨  想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for 循环将每种比萨的名称打印出来.修改这个for 循环,使其打印包含比萨名称的句子,而不 仅仅是比萨的名称.对于每种比 ...

  8. 阿尔法python 第四章 程序的控制结构

    程序的控制结构 年龄换算 平闰年 考试评级 大小写转换 判断位数并打印各位的值 回文数 地铁车票 判断星期 身体质量指数BMI 乞丐 水仙花数 篮球弹跳 阶乘 猴子摘桃 冰雹猜想 忽略倍数 素数 输出 ...

  9. python第四章答案猜数游戏_猜数游戏python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文实例为大家分享了python实现猜数游戏的具体代码,供大家参考,具体内容如下 ...

最新文章

  1. 没有什么效果的html标签,你知道却不常用的HTML标签(一)
  2. python while if 区别_对python中for、if、while的区别与比较方法
  3. git 恢复误删的分支
  4. Spring Cloud【Finchley】-11Feign项目整合Hystrix监控
  5. json在html中怎么遍历list,怎么对Json对象进行遍历呢?
  6. 05_Grafana的安装和Influxdb数据源配置
  7. Docker上部署FTP服务器(基于stilliard/pure-ftpd)
  8. 【TensorFlow】TensorFlow函数精讲之tf.contrib.layers.l1regularizer()-12_regularizer(lambda)
  9. ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的?...
  10. posix自己搭建消息队列_蘑菇街消息系统上云实践
  11. mysql可重复读实验_Mysql可重复读测试
  12. 自己编写的一个代码统计的小工具
  13. 百度用户增长SQL面试题
  14. h5摄像头拍照上传php,H5调用摄像头拍照上传
  15. python分析pcap文件_Python-对Pcap文件进行处理,获
  16. 兄弟dcp9020cdn手册_兄弟Brother DCP-9020CDN 驱动
  17. linux vi恢复文件怎么打开文件,Linux上vi编辑文件非正常退出后文件恢复
  18. 快速查询中通速递物流,查看未签收单号的最后站点
  19. Ural 2045. Richness of words 打表找规律
  20. table表格tr、td、合并、间距、边框合并、设置边距 代码

热门文章

  1. 白皮书 | 国内首份《Android 全埋点技术白皮书》开源所有项目源码!
  2. 神策数据荣登《中国企业家》“未来之星”榜单
  3. 历时数十载,20 位顶级大咖带你践行大数据与 AI(具体议程出炉)
  4. Linux学习总结(五十四)LVS nat 模式搭建
  5. SCN试验之二 checkpoin scn 与数据库scn的关系
  6. 清除BSS段的一般做法
  7. OneAlert 入门(一)——事件流
  8. 常见浏览器兼容性问题与解决方案
  9. [设计模式]设计模式之禅关于迪米特法则
  10. 从性能方面谈系统设计