本专栏python属于上手系列,因为网络资源众多,有从零基础开始介绍的,也有各种进阶应用,我在这个专栏里就从上手来介绍python,零基础也许不一定合适。但实践永远是获得认知的手段,因此上手实践操作对于学习编程还是来的容易一些。

莫愁前路无知己,天下谁人不识君!

前面介绍了python的安装、编译器选择、基础语法和数据类型、程序控制结构、函数、模块和类,完成基本的python编程已经没有问题了,本篇从程序的异常处理和文件输出进一步完善上手系列。

(1)异常处理

在开发程序过程中,总会遇到各种问题,有一些是语法错误,如python使用时将字符串与数字类型放在一起加减乘除、引号错误,或者拼写错误;有一些是逻辑问题,如for循环遍历不止(死循环),或者函数调用顺序不对等。出了问题肯定要解决才行,可以根据控制台错误提示来纠正自己的代码;同时出问题时如果不仔细找不到错误的地方是一件很头疼的事情。而如果开发了大段Python程序时,python解释器在执行程序时当检测到一个错误时就会触发异常,如果没有加入异常处理代码,程序会在异常处直接崩溃而不会继续执行后续的代码。试想谁会去用一个运行着突然就崩溃的软件。所以必须提供一种异常处理机制来增强程序的健壮性与容错性。良好的容错能力,能够有效的提高用户体验,维持业务的稳定性。注意的是:语法错误跟异常处理无关,所以我们在处理异常之前,必须避免语法上的错误。

写过java代码的同学肯定对这个异常处理有印象;在python中,异常处理基本构造也是这种:

try

这种结构中try-except或者try-finally通常匹配出现,也就是说else是可选的。结构中except可以有多个,但else或者finally只能有一个。

在程序执行的时候如果是try-except-else-finally结构,会首先执行try里面的Python语句,如果存在错误就执行except里的异常提示和finally里的异常处理;如果执行成功且没有错误提示就执行else中另一个代码块,else代码块执行后finally语句也会执行。但实际开发中很少加入else代码块,一般就使用try-expect,或者try-finally结构即可。

如下面一个完整结构的实际例子:

Created on Thu Oct 31 20:17:57 2019@author: Caojianhua
"""
try:                          #try代码块for i in range(10):print(i)
except:                       #触发异常处理块:except,如果try代码块中有异常,执行这里print("error")
else:                         #如果try代码块中正常运行无异常,执行else代码块     for j in range(2):print(i*j)
finally:                      #触发异常总结块,finally,这个异常处理块不管前面是否有异常都会执行print("no way!")

如果try语句里没有错误,就会执行else代码块和finally语句。这么写太费事,所以一般不会加入else代码块,直接使用try-except结构即可。

try:for i in range(10):print(i)
except:print("error")

再来列举一个错误的例子:

try:    for i in range(a):print(i)
except:print("有错误")                  #提示有错误

很明显上述try代码中a没有定义,使用try-except结构后,执行时如果try代码块中有错误系统会直接执行except中的语句,而不会在终端提示a没有定义。很显然这种我们自己定义的提示错误还不够完美或者考虑不周到,幸好python已经做的足够好。python将常出现的异常类型都进行了内置集成,在使用的时候直接在except后增加相应的异常类型关键词即可。

常用的异常类型对象如下:

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

其余类型名可参考:

Python 异常处理 | 菜鸟教程​www.runoob.com

上述语法错误的例子如果使用我们自己的错误提示,终端会打印"有错误"而不会提示a没有定义。为了改善代码,我们加入python的异常类型:

try:    for i in range(a):print(i)
except ValueError as e:     #使用python的ValueError类型,这是一个异常类,as用法是实例化print(e.args)           #调用实例error对象的args属性,提示参数错误

这样再执行的时候系统终端就会提示:NameError: name 'a' is not defined

再修改一下上述代码,将a修改为10,range(10)默认表示从0到10,:

try:    for i in range(10):print(10/i)     #使用10除以i,这里i肯定会取0值
except ValueError as error:print(err.args)   

执行时系统终端提示:ZeroDivisionError: division by zero

同时在开发过程中还可以在程序代码中使用raise语句来自定义触发异常,例如:

def getRemains(i):if i==0:raise ValueError('分母不能为0')return 10%itry:    for i in range(10):print(getRemains(i))
except ValueError as error:print(error.args) 

代码执行的时候就会直接抛出异常:('分母不能为0',)

这个异常处理在项目开发过程中每一个业务处理的时候都需要构建,使得程序更为安全和健壮,也有利于程序员快速定位错误,及时完善代码。对于初学者而言,也得学着开始逐步添加这类异常处理,为后续的进阶打下基础。

(2)文件

文件的读取应该是非常常见的,因为我们不可能一直从键盘输入相应的数据,许多图形图像、大篇幅的文字都是以文件形式存在的,所以有必要学会使用python来读取和存储文件。

这里首先引入常用的with方式:在处理文件时使用python的上下文管理器,可以保证文件在使用后被关闭、占用的内存资源被释放,使用方式就是with语句:

with open(filename,mode)as context:      #mode就是读、写等模式,conText可以自定义process file here    #处理文件代码

代码中对于文件file的操作使用python内置的open函数:

file object = open(file_name,mode)

因此上述的contextName也就是一个file对象,可以自定义命名。open函数中filename就是要操作的文件名,mode为模式,常用模式包括:

t   文本模式 (默认)。
x   写模式,新建一个文件,如果该文件已存在则会报错。
b   二进制模式。
+  打开一个文件进行更新(可读可写)。
U   通用换行模式(不推荐)。
r   以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb  以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+    以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w   打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb  以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+    以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a   打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab  以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

在处理代码部分,如果是读操作,就使用read()、readline()或readlines()等方法。具体对比如下:

read() :    读取整个文件内容到一个字符串中,以一个换行符结束
readline() : 把文件一行一行地读入一个列表中,并且保留每一行的换行符
readlines(): 读取文件中的下一行,也保留换行符,结果为列表

如果是写操作,就是write()或者writelines方法,与类似名称的读方法格式类似。

推荐使用下述格式代码来实现读取文件操作:

with open(filename, mode) as f:for line in f:#读或写方法代码

下面首先来看文本文件的读写,如txt文件、csv文件、prn文件等。文本文件是一种特殊的二进制文件。在文本文件中其内容都是字符串类型,同时也需要注意的是在文本文件中段落的换行或者缩进等都有转义字符。

读文本文件:with open(filename,mode='r') as f: f.read()

例如将如下文字保存到本地磁盘E盘的week8目录下,命名为test.txt文本文件:

马上进入冬天了,温度还维持在15度左右,看来又是一个暖冬了!
很想念老家那些好吃的东西,真是好久没有吃到了。
你在那边还好吗,有一点想你。

如果要读取该文件并将内容打印到终端,代码如下:

filename='E:/week8/test.txt'
with open(filename,'r') as f:for line in f:print(line)

终端打印出来的效果如前述完全一致。由于是读文本文件,默认模式就是r,所以也可以不写mode,直接使用with open(filename) as f。

如果使用read或者readline,代码如下:

filename='E:/test.txt'
#read函数直接读取所有内容,保持原有的换行
with open(filename,'rb') as f:print(f.read())#readline()函数读取,括号里可以给字节数参数,默认读取第一行所有字符,
#f.readline(10),表示从文件头开始读取到第10个字符
with open(filename) as f:     print(f.readline(10))

写文本文件:with open(filename,mode='w') as f: f.write("内容")

接下来看写入文本文件或者保存为文本文件的方法。此时就使用write或者writeline方法,修改open函数的mode模式为w,w为写入,这种模式会将原有内容清空,直接写入新的内容。如下代码:

filename='nn.txt'
with open(filename,'w') as f:     f.write("晴朗的天气n")f.write("没有一丝微风")

如果想在这个nn.txt里追加一些内容,则将open函数的模式修改为a,如下:

filename='nn.txt'
with open(filename,'a') as f:     f.write("明朗的月亮n")f.write("照亮着大地")

对于图形图像、音频、视频等多媒体文件等非文本文件,采用上述方式就不行了,需要采用其他的工具,使用第三方库。

读取图形文件

有许多类都提供了图形读取和处理的方法,在实践时选用的是anaconda平台的spyder开发模块,许多库都内置了,也就是在安装时就安装好了。这里选取几种加以介绍:

使用PIL库,使用代码示例吐下:

from PIL import Image        #从PIL包里导入Image类
import numpy as np           #导入numpy包
def readImage(image):        #构建一个读取图形文件的函数img=Image.open(image)    #调用image类的open函数,打开给定的图形文件,返回一个对象img.show()               #调用返回对象的show函数,显示图形img_rgb_array=np.array(img)   #使用numpy包的数组函数读取图形对象print(img_rgb_array.shape)    #打印图形对象大小image="e:/55.png"
readImage(image)

执行效果如下:

同时在终端上显示图形大小为(147, 117, 4)。

如果使用skimage库,示例代码可修改为:

from skimage import io             #导入skimage库的io类
def readImage(image):              #构建readImage函数img=io.imread(image)           #调用io类的imread函数,返回一个img对象io.imshow(img)                 #调用io类的imshow函数,传递img对象,执行显示image="e:/55.png"
readImage(image)

执行后,在终端直接显示当前图片:

同时还可以使用机器学习里的scipy和matplotlib库,如下代码:

import matplotlib.pyplot as plt       #导入机器学习类里的绘图包
from scipy import misc                #导入机器学习包里的misc类def readImage(image):img=misc.imread(image)            #调用misc类的imread函数,传递image文件,返回一个对象plt.imshow(img)                   #调用plt类的imshow函数,传入img对象plt.show()                        #调用plt类的显示函数image="e:/55.png"
readImage(image)

其结果与上述一致。

对于图形文件的存取,也都是使用这些库的对象函数,如imsave函数等来实现。这里受限于主题与篇幅不在赘述。

python except用法和作用_python上手--异常处理与文件相关推荐

  1. python except用法和作用_Python面试题(部分附带面试标准答案) 建议收藏

    1.请尽可能列举python列表的成员方法,并给出一下列表操作的答案: (1) a=[1, 2, 3, 4, 5], a[::2]=?, a[-2:] = ? (2) 一行代码实现对列表a中的偶数位置 ...

  2. python except用法和作用_Python保留字简单释义

    Guido van Rossum在1991年正式对外发布Python版本,现在已成为最流行的语言之一. 分别执行以下命令,查询Python语言中的保留字: import keywordkeyword. ...

  3. python匿名函数的作用_Python匿名函数 Lambda表达式作用

    在Python这门优美的编程语言中,支持一种有趣的语法格式(表达式),可以让我们在单行内创建一个最小的函数-python lambda匿名函数. 据说是借鉴了Lisp语言中lambda表达式,它可以使 ...

  4. python布尔值的作用_Python基础教程详解布尔变量的作用

    布尔值也叫真值,在Python开发(http://www.maiziedu.com/course/python-px/)中所有的值都被解释为真值,标准的真值为true和false.那么布尔变量在Pyt ...

  5. python中try语句的用法和作用_python基础知识三——try与except处理异常语句

    try/except介绍 与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错(python作为脚本语言没有编译的环节,在执行过程中对 ...

  6. python except用法与作用_Python中关于try-except用法的错误和异常处理详解

    本文实例讲述了Python中的错误和异常处理操作.分享给大家供大家参考,具体如下: #coding=utf8 print ''''' 程序编译时会检测语法错误. 当检测到一个错误,解释器会引发一个异常 ...

  7. python except用法和作用_121个问题答对80%那么恭喜你,Python的高薪工作迟早有你一份...

    1. Python和Java.PHP.C.C#.C++等其他语言的对比? 2. 简述解释型和编译型编程语言? 3. 代码中要修改不可变数据会出现什么问题? 抛出什么异 4. print 调用 Pyth ...

  8. python 静态方法 类方法 的作用_Python实例方法、类方法、静态方法的区别与作用详解...

    本文实例讲述了Python实例方法.类方法.静态方法的区别与作用.分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调 ...

  9. python logging模块的作用_Python 日志模块logging分析及使用-2

    本文作为Python日志模块的补充,主要介绍日志回滚RotatingFileHandler和TimedRotatingFileHandler的使用,以及其所带来的问题.Logger对象的日志等级是如何 ...

最新文章

  1. 【 NLS 】Steepest Descent Algorithm Iteration Procedure of TOA - Based Positioning
  2. jenkins 入门教程(下)
  3. python常用内置模块-Python之OS模块常用内置方法汇总
  4. java求导数_OO_JAVA_表达式求导
  5. servlet中弹出对话框
  6. SpringBoot 2.x 集成 Redis
  7. flash air 解析html,AIR 程序内部显示网页,并可以点击浏览的方法(HTMLLoader、StageWebView)...
  8. [译] 美国证券法对 ICO 及相关 Fund 的最新动态
  9. inject 响应式_Vue 3 组合式 provide/inject
  10. Linux自动删除n天前备份
  11. 南农计算机分数线,2021南京农业大学录取分数线_历年各专业分数线(2017-2020),各省投档线_一品高考网...
  12. linux下的密码破解软件
  13. IDEA中输入法无法切换成中文解决方法
  14. 程序人生 - 给IT新人的15点建议:苦逼程序员的辛酸反省与总结
  15. JavaRSAJS加密解密(整合版,仅供自己参考)
  16. Laplacian of Gaussian公式的英文推导过程
  17. mysql 实现yyyyww,在java中有YYYYWW格式吗
  18. 外部css样式不生效的原因
  19. 上海出租车电话一览表
  20. 图像识别python模块_人工智能之Python人脸识别技术--face_recognition模块

热门文章

  1. 电子工程师:不停改方案,神仙都要跑路!
  2. STM32为何在诸多的单片机中脱颖而出?
  3. 国一B题方案解析:轴距仅210mm的四旋翼有多稳?
  4. php 控制304,php静态文件返回304技巧分享
  5. c 语言 模板函数,函数模板特化
  6. linux ftp 553,修复使用vsftp出错553 Could not create file的有效方法
  7. python设置图片透明度_学习python第40天
  8. 产品型号 计算机硬件,主流CPU产品型号后缀名详解_CPUCPU评测-中关村在线
  9. python 数组 运算_python数据分析(二) python numpy--数组和矢量运算--数组对象
  10. 数学中各种矩阵收集(转至其他博主)