《Head First Python》第四章--持久存储
- 读文件
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
- “不可变类型” Python中的一些数据类型,一旦赋值,这个值就不能在改变。例如:name = 'zhangsan' name = 'lisi'这两行代码看似修改name字符串的值,实际上name的值确实改变了,变成了lisi,但是之前的‘zhangsan’的内容并没有改变。name变量只是从指向‘zhangsan’变成了指向‘lisi’,即name='lisi'实际是做了两件事:1.新建了一个‘lisi’的字符串 2.name指向‘lisi’
- Python变量只包含数据对象的一个引用,数据对象才真正包含数据。
- print(value, sep=' ', end='\n', file=sys.stdout)默认地BIF会显示到屏幕(sys.stdout),这个file参数是第四个位置参数,不过,如果想把数据输出到屏幕以外的地方,也不必为第二个或者第三个位置的参数提供值,因为他们也有缺省值。也就是说Python是根据参数名定位参数,跟位置无关,不像其他语言那样直接传递参数就行,而需要连要传递的参数名一起写全。例如,print('name', end='')以‘’空串结尾,不换行。这里就把end=也写上了。
- “腌制”是将数据对象保存到一个持久存储中的过程。
- “解除腌制”是从持久存储中恢复一个已保存的数据对象的过程。
- strip()方法可以从字符串去除不想要的空白符。
- finally组总会执行, 而不论try/except语句中发生什么异常。
- locals()BIF返回当前作用域中的变量集合。
- in操作符用于检查成员关系。
- with语句会自动处理所有一代开文件的关闭操作,即使出现遗产个也不例外。with语句也使用as关键字。
- 标准库的pickle允许你容易而高效地将Python数据对象保存到磁盘以及从磁盘恢复。
- pickle.dump()将数据保存到磁盘。
- pickle.load()从磁盘恢复数据。
《Head First Python》第四章--持久存储相关推荐
- 《Head First Python》笔记 第四章 持久存储
2019独角兽企业重金招聘Python工程师标准>>> 感觉比Java简单许多啊... 持久存储 Persistent:Saving data to file 将基于内存的数据存储到 ...
- 【python第四章——序列(列表、元组、字典、集合、字符串、正则)】
python第四章--序列 第四章--序列 4.1列表 4.2元组 4.3字典 4.4集合 4.5字符串(重要) 4.6正则表达式 第四章--序列 概念:序列指一块可存放多个值的连续内存空间,这些值按 ...
- Python(第四章) 序列的应用
第四章 本章概览 在Python中序列是最基本的数据结构.它是一块用于存放多个值的连续内存空间.Python中内置了5个常用的序列结构,分别是:列表.元组.集合.字典.字符串,本章详细讲解列表.元组. ...
- Python第四章-字典
第四章 字典-当索引不好用时 4.0 字典可以理解成是C++里的map,可以映射任何类型.字典这种结构类型称为映射(mapping). 字典是Python中唯一内建的映射类型,字典中的值并 ...
- 浙江大学pta答案python第四章_浙大PTA-Python题库 编程题第一章(1-1~1-3)题解
其他各章题解链接如下 浙大PTA-Python题库 编程题第一章(1-1~1-3)题解 https://blog.csdn.net/zimuzi2019/article/details/1070206 ...
- python第四章课后答案4.7_Python数据分析实战作业 第四章 Python数据分析实战 习题...
第四章 Python数据分析实战 习题(数据见附件sizhang.xlsx) 班主任现有一班级的两张表,如下. 表一:成绩表 学 号C#线 代Python 16010203788896 表二:信息表 ...
- Python第四章课后练习
练习4-1:比萨 想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for 循环将每种比萨的名称打印出来.修改这个for 循环,使其打印包含比萨名称的句子,而不 仅仅是比萨的名称.对于每种比 ...
- 阿尔法python 第四章 程序的控制结构
程序的控制结构 年龄换算 平闰年 考试评级 大小写转换 判断位数并打印各位的值 回文数 地铁车票 判断星期 身体质量指数BMI 乞丐 水仙花数 篮球弹跳 阶乘 猴子摘桃 冰雹猜想 忽略倍数 素数 输出 ...
- python第四章答案猜数游戏_猜数游戏python
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文实例为大家分享了python实现猜数游戏的具体代码,供大家参考,具体内容如下 ...
最新文章
- 没有什么效果的html标签,你知道却不常用的HTML标签(一)
- python while if 区别_对python中for、if、while的区别与比较方法
- git 恢复误删的分支
- Spring Cloud【Finchley】-11Feign项目整合Hystrix监控
- json在html中怎么遍历list,怎么对Json对象进行遍历呢?
- 05_Grafana的安装和Influxdb数据源配置
- Docker上部署FTP服务器(基于stilliard/pure-ftpd)
- 【TensorFlow】TensorFlow函数精讲之tf.contrib.layers.l1regularizer()-12_regularizer(lambda)
- ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的?...
- posix自己搭建消息队列_蘑菇街消息系统上云实践
- mysql可重复读实验_Mysql可重复读测试
- 自己编写的一个代码统计的小工具
- 百度用户增长SQL面试题
- h5摄像头拍照上传php,H5调用摄像头拍照上传
- python分析pcap文件_Python-对Pcap文件进行处理,获
- 兄弟dcp9020cdn手册_兄弟Brother DCP-9020CDN 驱动
- linux vi恢复文件怎么打开文件,Linux上vi编辑文件非正常退出后文件恢复
- 快速查询中通速递物流,查看未签收单号的最后站点
- Ural 2045. Richness of words 打表找规律
- table表格tr、td、合并、间距、边框合并、设置边距 代码