在上一篇文章中,我们介绍了 Python 的函数和模块,现在我们介绍 Python 中的异常和文件。

查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9963920.html

异常和文件

异常

异常也叫例外。在之前的几篇文章中,你已经看到过异常。当程序运行错误是出现,比如不正确的调用和代码不规范等。当你的程序出现意外情况是就会发生异常并终止运行。
下面代码用 5 除以 0 产生 ZeroDivisionError 异常。

num1 = 5
num2 = 0
print(num1/num2)

运行结果:

>>>
ZeroDivisionError: division by zero
>>>

不同的原因产生不同的异常,一般有:
ImportError:引入模块错误,通常是模块不存在。
IndexError:读取列表超出索引范围。
NameError:使用未声明的变量。
SyntaxError:代码语法错误。
TypeError:当操作或函数处理不合适类型。
ValueError:内建操作或函数,接收到类型正确,但值不正确。

Python 还有其他几个内置的异常,比如 ZeroDivisionErrorOSError。第三方库也经常定义自己的异常。

异常处理
我们使用 try/except 语句捕捉程序运行时产生的异常。
try 块用来包含可能产生异常的代码块。如果产生异常 try 块停止运行,except 块里的代码开始执行,如果程序运行一切正常,则不会执行 except 块里的代码。

try:
num1 = 5
num2 = 0
print(num1/num2)
print("Done!")
except ZeroDivisionError:
print("Has a error")
print("due to zero division")

运行结果:

>>>
Has a error
due to zero division
>>>
上面的例子里 except 语句定义了 ZeroDivisionError 异常捕捉。

try 语句可以拥有多个 except 定义语句来处理异常。多个异常也可以使用一个 except 块来捕捉。

try:
var = 5
print(var + "string!")
print(var/2)
except ZeroDivisionError:
print("Divided by zero!")
except (ValueError,TypeError):
print("Has a error!")

运行结果:

>>>
Has a error!
>>>

except 语句如果没有申明要铺获的异常,将捕获所有的异常。我们应该谨慎地使用这种异常处理方式,它虽然捕获了意外错误但是却把编程错误隐藏了。

try:
var = 5
print(var + "string!")
print(var/2)
except:
print("An error occurred")

运行结果:

>>>
An error occurred
>>>
这种异常处理方式通常用在处理用户输入。

finally 语句
假设你正在读取一份文件。你应该确保文件对象被正确关闭,无论是否会发生异常。
为了确保代码最终能够运行不论是否有异常发生,我们可以使用 finally 语句。finally 放在 try/except 语句的后面。

try:
str = "Hello"
var = 5
print(str)
print(var/0)
except ZeroDivisionError:
print("Divided by zero")
finally:
print("This code will run no matter what")

运行结果:

>>>
Hello
Divided by zero
This code will run no matter what
>>>

下面代码会输出什么?

try:
print(1)
except:
print("a")
finally:
print("Hello")

运行结果:

>>>
1
Hello
>>>

finally 语句最终会被执行不管前面的异常到没有捕捉到,包括在 except 语句里产生的异常。

try:
print(1)
print(5/0)
except ZeroDivisionError:
print(Error_var)
finally:
print("This is executed last!")

运行结果:

>>>
1
This is executed last!
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
NameError: name 'Error_var' is not defined
>>>

抛出异常
使用 raise 语句抛出一个异常

print(1)
raise ZeroDivisionError
print(5)

运行结果:

>>>
1
ZeroDivisionError
>>>
你需要声明你要抛出的例外名称。

抛出的异常可以用参数来指出这是什么错误。

age = 12
raise TypeError("Invalid type!")

运行结果:

>>>
TypeError("Invalid type!")
>>>

except 块里,raise 语句可以不用声明异常的名称重新抛出捕捉到的异常。

try:
num= 5/0
except:
print("Has a error")
raise

运行结果:

>>>
ZeroDivisionError: division by zero Has a error
>>>

断言
Python 的断言就是检测一个条件。如果条件为真,它什么都不做,条件为假会触发一个错误信息。
断言可以打开或关闭。断言使用 assert 语句声明。

print(1)
assert 1 + 2 == 3
print("Yes")
assert 1 + 1 == 0
print("Yes")

运行结果:

>>>
1
Yes
AssertionError
>>>
程序员通常在函数的开头放置断言以检查有效的输入,在函数调用之后放置断言以检查有效的输出。
断言可以在运行是通过添加 -O 或 -OO 选项来关闭。

下面代码打印出来什么?

print(1)
assert 1 != 2
print(2)
assert True
print(3)
assert False
print(4)
assert 1 + 1 == 2
print(5)

运行结果:

>>>
1
2
3
AssertionError
>>>

断言的第二个参数可以用来给 AssertionError 做参数。

num = 5
assert (num <= 0),"The num is bigger than zero"

运行结果:

>>>
AssertionError: The num is bigger than zero
>>>
AssertionError 异常可以像任何其他异常一样使用 try/except 语句被捕捉和处理,如果程序不处理,这种类型的异常将终止程序的运行。

文件处理

打开文件
读写文件是最常见的 IO(输入输出)操作。Python 内置了读写文件的函数,要读写文件需要打开一个文件对象,使用 open 函数。
open 函数打开的对象在 Python 中统称为 file-like Object。除了文件外,还可以是内存的字节流,网络流,自定义流等等。

f = open("test.txt")
注意:open 函数的参数是文件的路径。如果文件与程序位于同一个目录中,则可以不要指定路径直接使用文件名。

可以使用 open 函数的第二个参数来指定打开文件的模式。

# read mode
open("test.txt", "r")
open("test.txt") # write mode
open("test.txt", "w") # binary write mode
open("test.txt", "wb")

打开文件模式列表:

特别注意:使用 "w" 模式时,如果文件已经存在,会把旧文件的内容全部都清除掉。

文件打开后应该使用 close 方法关闭文件。

f = open("test.txt","w")
# close the file
f.close()
接下来我们会读取和写入文件。

读取文件
使用 open 方法打开的文件可以使用 read 方式来读取内容。

f = open("test.txt","r")
content = f.read()
print(content)
f.close()
打印文件名为 "test.txt" 的所有内容。

若要读取一定数量的文件内容,可以使用一个数字作为参数来调用 read 函数。该数字确定要读取多少个字节的内容。
可以对同一个文件对象进行多次的 read 调用,该字节读取文件内容。在没有参数的情况下,read 函数返回文件的其余部分。

f = open("test.txt","r")
print(f.read(32))
print(f.read(16))
print(f.read(8))
print(f.read())
f.close()

当所有的内容被读取后,再调用 read 函数返回空字符串。

f = open("test.txt","r")
f.read()
print("reading")
print(f.read())
print("finished!")
f.close()

运行结果:

>>>
reading finished!
>>>

打开一个文件读取它的内容,打印内容的长度。

f = open("test.txt","r")
str = f.read()
print(len(str))
f.close()

运行结果:

>>>
16
>>>

要一行一行地读取,我们可以使用 readline 方法,也使用 readlines 一次读取所有内容并返回一个列表,列表里的每一项元素表示一行内容。

f = open("test.txt","r")
print(f.readlines())
f.close()

运行结果:

>>>
['I like Python!!!']
>>>

使用 for 语句遍历文件的每一行:

f = open("test.txt","r")
for line in f:
print(line)
f.close()

运行结果:

>>>
Line 1 : Hello world! Line 2 : I like Python! Line 3 : I like Java!
>>>
在输出中,返回的行包含换行符,打印 print 函数在输出的末尾自动添加新行。

写文件
使用 write 方法把内容写到文件里。

f = open("test.txt","w")
f.write("I am happy!")
f.close() f = open("test.txt","r")
print(f.read())
f.close()

运行结果:

>>>
I am happy!
>>>
如果文件不存在,"w" 将会创建一个文件。

写入模式下,如果文件存在将清除全部内容并往文件写入新内容。

f = open("test.txt","r")
print("Reading...")
print(f.read())
print("Finished!")
f.close() f = open("test.txt","w")
f.write("New text")
f.close() f = open("test.txt","r")
print("Reading new contents")
print(f.read())
print("Finished!")
f.close()

运行结果:

>>>
Reading...
I am happy!
Finished!
Reading new contents
New text
Finished!
>>>
特别注意:原有的文件将被新内容重写。

如果 write 写入成功,方法返回写入的字节数。

msg = "I like Python!!!"
f = open("test.txt","w")
count = f.write(msg)
print(count)
f.close()

运行结果:

>>>
16
>>>

读写文件
确保文件在使用后始终关闭,避免浪费资源是良好的编程习惯。我们使用 try/finally 语句。

try:
f = open("test.txt")
print(f.read())
finally:
f.close()
当异常发生时也能确保文件对象被正确关闭。

每次都这样要关闭文件是在太繁琐。所以,Python 引入了 with 语句来帮我们自动调用 close() 方法。

with open("test.txt") as f:
print(f.read())
使用 with 语句打开文件是个好习惯,就算有例外发生,with 语句也会自动帮我们关闭文件句柄。

“朝着一个方向疯狂奔跑的感觉,真好。”

Python学习手册之Python异常和文件的更多相关文章

  1. Python学习手册之 Python 之禅、Python 编程规范和函数参数

    在上一篇文章中,我们介绍了 Python 的正则表达式使用示例,现在我们介绍 Python 之禅. Python 编程规范和函数参数.查看上一篇文章请点击:https://www.cnblogs.co ...

  2. 15、python学习手册之:元组、文件及其他

    1.使用文本来存储python对象时,必须使用转换工具把对象转成字符串 2.内置函数eval可以把字符串当做可执行程序代码:eg  s = ‘[1,2,3]’    eval(s) -->[1, ...

  3. Python学习手册 :Python 学习笔记第一天

    获取当前目录路径: import os os.getcwd() 在输入python程序时,尽量让不是嵌套结构的语句处于最左侧,要不然系统或许会出现"SyntaxError"错误 获 ...

  4. Python学习手册之Python介绍、基本语法(二)

    在上一篇文章中,我们介绍了Python的一些基本语法,现在我们继续介绍剩下的Python基本语法.查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/987193 ...

  5. Python学习手册之Python介绍、基本语法(一)

    一.什么是python? python是一种高级的编程语言.它适合编写一些应用程序,比如:网站编程,脚本编程,科学计算和最近非常热门的AI(人工智能).目前,Google,腾讯,百度,阿里巴巴,豆瓣都 ...

  6. 《Python学习手册》读书笔记

    之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...

  7. 《Python学习手册》读书笔记【转载】

    转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉 ...

  8. 《Python学习手册 第五版》 -第14章 迭代和推导

    承接上一章for循环的讲解,迭代和推导,是对for循环的一种深入的探索和扩展 本章重点内容 1.迭代 1)什么是迭代?都有哪些分类 2)常规的使用方法 3)多遍迭代器VS单遍迭代器 2.列表推导 1) ...

  9. Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘

    Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...

随机推荐

  1. 三大集合框架之Set

    Set介绍 Set相对于List.Map是最简单的一种集合.集合中的对象不按特定的方式排序,并且没有重复对象. 特点: 它不允许出现重复元素: 不保证和政集合中元素的顺序 允许包含值为null的元素, ...

  2. Azure进阶攻略丨Azure网络通不通,PsPing&PaPing告诉你答案

    很多时候,为了解决一些问题,要查各种文档,很麻烦你造吗!做「伸手党」又容易被鄙视,这时候就需要用到[Azure 进阶攻略]啦!特此,我们推出关于 Azure 常用操作指南的系列文章,每篇涉及一个 Az ...

  3. vsftpd的安装与使用

    1.安装vsftpdyum -y install vsftpdservice vsftpd startchkconfig vsftpd on2.配置vsftpd#进入vsftpd配置文件vim /et ...

  4. Sendip 命令行发包工具,支持IP、TCP、UDP等

    Sendip是一个linux平台的命令行发数据包工具,目前(2018年2月)支持的协议有ipv4.ipv6.icmp.tcp.udp.bgp.rip.ntp,作者表示其他协议将会后面支持,当他有空写的 ...

  5. 查询python的安装路径

    参考链接: https://blog.csdn.net/orangleliu/article/details/44907221 (tf_14) novak@novak-ZBook15G2:~$ pyt ...

  6. May 23rd 2017 Week 21st Tuesday

    Winners are not those who never fail but those who never quit. 成功者不是从不失败,而是从不放弃. Nothing is impossib ...

  7. LA 3415 保守的老师

    题目链接:https://vjudge.net/contest/161820#problem/E 题意: 有一些同学,要从中选出一些同学来,人数尽量多,但是,两两之间要满足至少一个条件(身高差> ...

  8. 【转】Android手机分辨率基础知识(DPI,DIP计算)

    1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 A ...

  9. VirtualBox改变虚拟硬盘位置

    原本放虚拟硬盘的位置容量不足,因此将原来的虚拟硬盘放到了一个相对空闲的分区.设置虚拟硬盘位置时出现一点小问题,解决过程记录如下. 1. 将虚拟硬盘复制到目标位置后,假设为“F:\Ubuntu 16.0 ...

  10. webpack的基本配置和一些理解

    最近花了两周的休息时间学习了webpack,能够可以编写自己项目所需要的配置文件,总体来说webpack是一种非常优秀的前端模块化的打包工具,非常值得花时间来研究学习. 什么是webpack,它的出现 ...