Python学习手册之Python异常和文件
在上一篇文章中,我们介绍了 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 还有其他几个内置的异常,比如 ZeroDivisionError 和 OSError。第三方库也经常定义自己的异常。
异常处理
我们使用 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异常和文件的更多相关文章
- Python学习手册之 Python 之禅、Python 编程规范和函数参数
在上一篇文章中,我们介绍了 Python 的正则表达式使用示例,现在我们介绍 Python 之禅. Python 编程规范和函数参数.查看上一篇文章请点击:https://www.cnblogs.co ...
- 15、python学习手册之:元组、文件及其他
1.使用文本来存储python对象时,必须使用转换工具把对象转成字符串 2.内置函数eval可以把字符串当做可执行程序代码:eg s = ‘[1,2,3]’ eval(s) -->[1, ...
- Python学习手册 :Python 学习笔记第一天
获取当前目录路径: import os os.getcwd() 在输入python程序时,尽量让不是嵌套结构的语句处于最左侧,要不然系统或许会出现"SyntaxError"错误 获 ...
- Python学习手册之Python介绍、基本语法(二)
在上一篇文章中,我们介绍了Python的一些基本语法,现在我们继续介绍剩下的Python基本语法.查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/987193 ...
- Python学习手册之Python介绍、基本语法(一)
一.什么是python? python是一种高级的编程语言.它适合编写一些应用程序,比如:网站编程,脚本编程,科学计算和最近非常热门的AI(人工智能).目前,Google,腾讯,百度,阿里巴巴,豆瓣都 ...
- 《Python学习手册》读书笔记
之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...
- 《Python学习手册》读书笔记【转载】
转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉 ...
- 《Python学习手册 第五版》 -第14章 迭代和推导
承接上一章for循环的讲解,迭代和推导,是对for循环的一种深入的探索和扩展 本章重点内容 1.迭代 1)什么是迭代?都有哪些分类 2)常规的使用方法 3)多遍迭代器VS单遍迭代器 2.列表推导 1) ...
- Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘
Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...
随机推荐
- 三大集合框架之Set
Set介绍 Set相对于List.Map是最简单的一种集合.集合中的对象不按特定的方式排序,并且没有重复对象. 特点: 它不允许出现重复元素: 不保证和政集合中元素的顺序 允许包含值为null的元素, ...
- Azure进阶攻略丨Azure网络通不通,PsPing&PaPing告诉你答案
很多时候,为了解决一些问题,要查各种文档,很麻烦你造吗!做「伸手党」又容易被鄙视,这时候就需要用到[Azure 进阶攻略]啦!特此,我们推出关于 Azure 常用操作指南的系列文章,每篇涉及一个 Az ...
- vsftpd的安装与使用
1.安装vsftpdyum -y install vsftpdservice vsftpd startchkconfig vsftpd on2.配置vsftpd#进入vsftpd配置文件vim /et ...
- Sendip 命令行发包工具,支持IP、TCP、UDP等
Sendip是一个linux平台的命令行发数据包工具,目前(2018年2月)支持的协议有ipv4.ipv6.icmp.tcp.udp.bgp.rip.ntp,作者表示其他协议将会后面支持,当他有空写的 ...
- 查询python的安装路径
参考链接: https://blog.csdn.net/orangleliu/article/details/44907221 (tf_14) novak@novak-ZBook15G2:~$ pyt ...
- May 23rd 2017 Week 21st Tuesday
Winners are not those who never fail but those who never quit. 成功者不是从不失败,而是从不放弃. Nothing is impossib ...
- LA 3415 保守的老师
题目链接:https://vjudge.net/contest/161820#problem/E 题意: 有一些同学,要从中选出一些同学来,人数尽量多,但是,两两之间要满足至少一个条件(身高差> ...
- 【转】Android手机分辨率基础知识(DPI,DIP计算)
1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 A ...
- VirtualBox改变虚拟硬盘位置
原本放虚拟硬盘的位置容量不足,因此将原来的虚拟硬盘放到了一个相对空闲的分区.设置虚拟硬盘位置时出现一点小问题,解决过程记录如下. 1. 将虚拟硬盘复制到目标位置后,假设为“F:\Ubuntu 16.0 ...
- webpack的基本配置和一些理解
最近花了两周的休息时间学习了webpack,能够可以编写自己项目所需要的配置文件,总体来说webpack是一种非常优秀的前端模块化的打包工具,非常值得花时间来研究学习. 什么是webpack,它的出现 ...