Python(Head First)学习笔记:三
3 文件与异常:调试、处理错误、迭代、改进、完善
处理错误:利用Python的异常处理机制来处理异常情况。
程序外部的数据:大多程序基本模型:首先输入数据,进行处理,然后存储、显示、打印或传输。
Python从文件读取数据:Python的open()BIF就是用来与文件交互的,结合for语句使用,可以非常容易地读取数据。
使用open()流程:读取文件数据时,Python会创建一个迭代器,从文件向代码输入数据行,一次传入一行数据。
实例:
打开终端,输入:python3
import os
os.getcwd() #获取当前工作目录
os.chdir('包含数据文件的文件夹目录')
data=open('DataFile.txt')
print(data.readline(),end='') #输出数据文件第一行数据
print(data.readline(),end='') #输出数据文件第二行数据
data.seek(0) #用seek()方法返回文件起始位置
for each_line in data: #使用迭代的方法逐行输出数据文件
print(each_line,end=' ')
data.close() #关闭数据文件
进一步查看数据
split()方法返回一个字符串列表,然后赋值到一个目标标识符列表,
通过将split()方法关联到输出变量,可以完成对数据文件的分割;
如:A:I am a cool boy!
用each_line.split(":")这句话可以分解成A和I am a cool boy!
用(role,line_spoken) = each_line.split(“:”),来获取分解后的数据。
实例:
data = open('DataFile.txt')
for each_line in data:
(role,line_spoken)=each_line.split(':') #需要缩进
print(role,end='') #缩进长度和上面一样
print(' said: ',end='')
print(line_spoken,end='')
了解数据的内容
针对split()方法,上面的实例中,通过(role,line_spoken)=each_line.split(':') 这句代码,实现了将冒号":"分成两部分,
然后分别赋值给role和line_spoken,但是当单行中出现多个冒号,就会报错:too many values to unpack。
为了找到这个错误的原因,通过help(each_line.split)来查看:
split()有一个可选参数,用于设置分割的数量,将其设置为1,则只会分解成两个部分,
所以,可以将(role,line_spoken)=each_line.split(':') 这行代码改为(role,line_spoken)=each_line.split(':',1)即可。
更好的了解数据内容
仍然针对split()方法,当数据行中没有冒号时,split(':',1)无法查找到,所以就会报错:need more than 1 value to unpack。
由此引发了一个思考:如果数据文件中存在大量的这种没有冒号,或符合split()方法的判定,那么一定会报各种错误,该如何解决呢?
有两个方向可以考虑:1 增加额外逻辑,确定是否需要调用split()方法;
2 不断调试,直到错误都解决。
方法一:增加额外逻辑
find()方法的引入,可以通过find()来尝试找出一个字符串中的子串,如果没有找到返回值是-1,如果找到了返回该子串在字符串中的索引位置。
实例:>>>each_line = "I tell you, there'no such thing as a flying circus."
>>>each_line.find(':')
返回值为-1,因为字符串中没有包含冒号;
修改字符串为:>>>each_line = "I tell you: there'no such thing as a flying circus."
>>>each_line.find(':')
返回值为10,正好是字符串的第10个字符,从0开始计下标,空格也算一个字符。
现在可以通过这个find()方法来改进上面的实例,具体如下:
data = open('DataFile.txt')
for each_line in data:
if not each_line.find(':')==-1: #这里增加了一个判断,即:如果找到了冒号,则继续执行,用到了not关键字。
(role,line_spoken)=each_line.split(':') #需要缩进
print(role,end='') #缩进长度和上面一样
print(' said: ',end='')
print(line_spoken,end='')
data.close()
注:not关键字是对值进行取反的意思。
问:为什么要用取反,而不是if each_line.find(':')>=0?这个有待进一步学习,感觉取反会更快些吧~
方法二:处理异常
当程序运行报错时,Python解释器会显示一个tranceback,后面跟一个错误消息,这个错误消息就异常(exception)。
先尝试运行代码,然后处理可能发生的错误。
try/except机制的引入
基本格式:try:
代码内容(可能包含未知错误)
except:
错误回复代码
找出要保护的代码
对于上面的实例可以改为:
data = open('DataFile.txt')
for each_line in data:
try: #保护代码避开运行时的错误
(role,line_spoken)=each_line.split(':') #需要缩进
print(role,end='') #缩进长度和上面一样
print(' said: ',end='')
print(line_spoken,end='')
except:
pass #如果出现一个运行时错误,会执行这个代码
data.close()
注:对于列表,用中括号[]扩起来的是可以改变的列表;
用小括号()扩起来的是不可以改变的列表,可以认为是一个常量列表。
增加更多错误检查代码
当数据文件突然丢失或破坏了,那么data=open('DataFile.txt')就会报错,所以有必要对数据文件的存在性进行检查:
完善后的实例如下:
方法一:
import os
if os.path.exists('DataFile.txt'):
data = open('DataFile.txt')
for each_line in data:
try: #保护代码避开运行时的错误
(role,line_spoken)=each_line.split(':') #需要缩进
print(role,end='') #缩进长度和上面一样
print(' said: ',end='')
print(line_spoken,end='')
except:
pass #如果出现一个运行时错误,会执行这个代码
data.close()
else:
print('The data file is misssing!')
方法二:
try: #保护代码避开运行时的错误
data = open('DataFile.txt')
for each_line in data:
(role,line_spoken)=each_line.split(':') #需要缩进
print(role,end='') #缩进长度和上面一样
print(' said: ',end='')
print(line_spoken,end='')
data.close()
except:
print(‘The data file is missing!’) #文件丢失
问答:那么经过上面两种方法的实现,哪种方法更好一些呢?
随着越来越多的错误和异常,第一种方法:增加额外代码和逻辑的复杂度也会随之增加,到后来就会比较乱;
第二种方法:采用异常处理机制,可以将主要注意力集中于代码的真正功能和实现。
所以,总的来说,采用异常处理机制这种方式更合适。
进一步的完善:特定指定异常
通过对except代码指定错误类型,就可以把一般化的异常处理转换为具有特定性的处理,如下:
try: #保护代码避开运行时的错误
data = open('DataFile.txt')
for each_line in data:
try:
(role,line_spoken)=each_line.split(':') #需要缩进
print(role,end='') #缩进长度和上面一样
print(' said: ',end='')
print(line_spoken,end='')
except ValueError:
pass
data.close()
except IOError:
print(‘The data file is missing!’) #文件丢失
注:Python中不可改变的常量列表称为元组:tuple,一旦列表数据赋值到一个元组,就不能再改变,元组的符号是小括号(tuple)。
------------------------------------------The End of Third Chapter---------------------------------------------
Python(Head First)学习笔记:三的更多相关文章
- python网络编程学习笔记(三):socket网络服务器(转载)
1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象 建立socket对 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- Python Built-in Function 学习笔记
Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...
- python3.4学习笔记(三) idle 清屏扩展插件
python3.4学习笔记(三) idle 清屏扩展插件python idle 清屏问题的解决,使用python idle都会遇到一个常见而又懊恼的问题——要怎么清屏?在stackoverflow看到 ...
- iView学习笔记(三):表格搜索,过滤及隐藏列操作
iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- Requests:Python HTTP Module学习笔记(一)(转)
Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
随机推荐
- S3 Select for Java 使用记录
背景 后台基本使用 Amazon 的全家桶(EC2.DynamoDB.S3.Step Fuction 等等)构建.现在需要根据访问者的 IP 确定访问者的国家或地区. 已知: 访问者 IP 一个 ip ...
- AOSP 预置 APP
Android 系统预置 APP 是做 Framework 应用开发经常经常会遇到的工作,预置 APP 分为两种,一种是直接预置 APK,一种是预置带有源码的 APP. 预置 apk 示例说明 以 . ...
- 100天搞定机器学习|Day17-18 神奇的逻辑回归
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
- linux100day(day4)--文本处理三剑客
在介绍三剑客之前,先来认识一下通配符和正则表达式 通配符 正则表达式 作用:通过一些特殊字符,来表示一类字符内容 1.字符匹配 . 任意一个字符 [ ] 范围内的任意一个字符 [^ ] 取 ...
- 聊一聊 SpringBoot 自动配置的原理
解析思路 我们建立好一个SpringBoot的工程后,我们将从启动类,SpringBootApplication开始进行探究. 开始解析 首先我们建立一个 Springboot的工程.找到启动类,我们 ...
- testng学习笔记-- 场景和module
一.定义 TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便. TestNG是一个开源自动化测试框架;TestNG表示下一代(Next Ge ...
- Tomcat源码分析 (十)----- 彻底理解 Session机制
Tomcat Session 概述 首先 HTTP 是一个无状态的协议, 这意味着每次发起的HTTP请求, 都是一个全新的请求(与上个请求没有任何联系, 服务端不会保留上个请求的任何信息), 而 Se ...
- vs中代码的发行以及图标的添加
发布代码,将Debug改成Release 在属性代码生成中找到运行库将多线程MD改成MT应用(使文件适用于普遍的电脑) 重新生成解决方案然后就可以在项目文件夹中找到Release底下的.exe文件(可 ...
- .NET Core 小程序开发零基础系列(1)——开发者启用并牵手成功
最近几个月本人与团队一直与小程序打交道,对小程序的实战开发算比较熟悉,也因一些朋友经常问我各种小程序问题,无不能一一回答,想了很久,决定还是空余时间来写写文章吧,偶尔发现一个人安静的时候写文章特爽 ...
- 字符串匹配算法之————KMP算法
上一篇中讲到暴力法字符串匹配算法,但是暴力法明显存在这样一个问题:一次只移动一个字符.但实际上,针对不同的匹配情况,每次移动的间隔可以更大,没有必要每次只是移动一位: 关于KMP算法的描述,推荐一篇博 ...