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)学习笔记:三的更多相关文章

  1. python网络编程学习笔记(三):socket网络服务器(转载)

    1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象  建立socket对 ...

  2. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  3. Python Built-in Function 学习笔记

    Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...

  4. python3.4学习笔记(三) idle 清屏扩展插件

    python3.4学习笔记(三) idle 清屏扩展插件python idle 清屏问题的解决,使用python idle都会遇到一个常见而又懊恼的问题——要怎么清屏?在stackoverflow看到 ...

  5. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  6. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  7. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  8. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  9. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  10. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

随机推荐

  1. 【POJ - 2431】Expedition(优先队列)

    Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离 ...

  2. Chrome 开发工具之 Memory

    开发过程中难免会遇到内存问题,emmm... 本文主要记录一下Chrome排查内存问题的面板,官网也有,但有些说明和例子跟不上新的版本了,也不够详细...   !!! 多图预警!!!    简单的内存 ...

  3. Linux系统与程序监控工具atop教程

    引言 Linux以其稳定性,越来越多地被用作服务器的操作系统(当然,有人会较真地说一句:Linux只是操作系统内核:).但使用了Linux作为底层的操作系统,是否我们就能保证我们的服务做到7*24地稳 ...

  4. 直击根源:微信小程序中web-view再次刷新后页面需要退两次

    背景 在上一章(直击根源:vue项目微信小程序页面跳转web-view不刷新)解决了vue在小程序回退不刷新的问题之后,会引出了一个刷新的页面需要点击返回两次才能返回上一个页面 问题描述 在A页面从B ...

  5. hadoop2.7之作业提交详解(下)

    接着作业提交详解(上)继续写:在上一篇(hadoop2.7之作业提交详解(上))中已经讲到了YARNRunner.submitJob() [WordCount.main() -> Job.wai ...

  6. python历史背诵

    一.python简介 python2:源代码不统一 有重复功能的代码 默认编码是ascii 没有中文 输出中文需要用头文件 #-*-coding=utf-8-*- 进行转换 py3:源代码统一 没有重 ...

  7. 性能测试学习第一天-----概念、环境、LR录制&参数化

    1.性能测试的概念: 通过一定的手段,在多并发情况下,获取被测系统的各项性能指标, 验证被测系统在高并发下的处理能力.响应能力.稳定性等,能否满足预期.定位性能瓶颈,排查性能隐患,保障系统的质量,提升 ...

  8. Streaming-大数据的未来

    分享一篇关于实时流式计算的经典文章,这篇文章名为Streaming 101: The world beyond batch 那么流计算如何超越批处理呢? 从这几个方面说明:实时流计算系统,数据处理模式 ...

  9. 深入浅出TCP与UDP协议

    深入浅出TCP与UDP协议 网络协议是每个前端工程师的必修课,TCP/IP协议族是一系列网络协议的总和,而其中两个具有代表性的传输层协议,分别是TCP与UDP,本文将介绍这两者以及他们之间的区别. 一 ...

  10. idea实现第一个springboot程序

    1.环境准备 JDK:1.8 Apache Maven: 3.6.1 IntelliJ IDEA 2019.1.3 x64 SpringBoot 1.5.9.RELEASE:1.5.9: 1.1.MA ...