一、异常的简介
- 异常的简介:
- 程序在运行过程中可能会出现一些错误。比如:使用了不存在的索引,两个不同类型的数据相加。。。这些错误我们称之为异常。
- 处理异常:
- 程序运行时出现异常,目的并不是让我们的程序直接终止! python是希望在出现异常时,我们可以编写代码来对异常进行处理。
演示1:
import requests
print('python')
# try代码的意思时尝试执行以下代码,如果代码不会出错,就直接执行try内部的代码;如果出错,则执行except内部的代码。
try:
response = requests.get('www.baidu.com')
print(response)
except:
print('代码出错才会执行本语句!')
else:
print('代码没有出错')
print('pycharm')
打印输出结果:
python
代码出错才会执行本语句!
pycharm
演示2:
import requests
print('python')
# try代码的意思时尝试执行以下代码,如果代码不会出错,就直接执行try内部的代码;如果出错,则执行except内部的代码。
try:
print(111)
except:
print('代码出错才会执行本语句!')
else:
print('代码没有出错')
print('pycharm')
打印输出结果:
python
111
代码没有出错
pycharm
- 处理异常的语法:
try:
代码块(可能出错的代码块):出错了就不执行,没有错就执行
except:
代码块(出错了就执行的语句,没有出错就不执行)
else:
代码(没有出错就执行,出错了就不执行)
二、异常的传播
- 异常的传播:
- 1、当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会传播。如果函数中没有对异常进行处理,则异常会继续祥函数调用传播。如果函数调用处处理了异常,则不会=传播异常,如果没有处理则继续向调用处传播。知道传播到全局作用域(主模块)如果依然没有处理,则程序终止,并显示异常信息。
- 2、当程序运行过程中出现异常以后,所有异常信息会保存到一个异常对象中。而异常传播时,实际上就是异常对象抛给了调用处。
演示1:
def fn():
print('我是fn')
try:
a = 1 / 0
except:
print('代码出错了')
fn()
打印输出结果:
我是fn
代码出错了
演示2:
def fn():
print('我是FN')
a = 1 / 0
try:
fn()
except:
print('代码出错运行此行')
打印输出结果:
我是FN
代码出错运行此行
演示3:
def fn():
print('我是fn')
a = 1 / 0
def fn1():
print('我是fn1')
fn()
def fn2():
print('我是fn2')
fn1()
def fn3():
print('我是fn3')
fn2()
fn3()
打印输出结果:
Traceback (most recent call last):
File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 47, in <module>
fn3()
File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 44, in fn3
fn2()
File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 39, in fn2
fn1()
File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 34, in fn1
fn()
File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 29, in fn
a = 1 / 0
ZeroDivisionError: division by zero
我是fn3
我是fn2
我是fn1
我是fn
结论:当出现类似于继承关系的函数某一处结果出现错误,那么之后的函数都会报错。
三、异常对象
- ZeroDivisionError捕获除零错误异常。
- NameError捕获未声明初始化变量异常
- Exception捕获所有异常。
演示1:
print('异常出现之前')
try:
# print(response)
a = 1 / 0
except ZeroDivisionError:
print('代码出错了')
print('异常出现之后')
打印输出结果:
异常出现之前
代码出错了
异常出现之后
总结:
ZeroDivisionError代表着可捕获除零错误异常。
ZeroDivisionError只会捕获ZeroDivisionError的异常,并不会捕获其他的异常。
演示2:
print('异常出现之前')
try:
print(response)
# a = 1 / 0
except NameError:
print('代码出错了')
print('异常出现之后')
打印输出结果:
异常出现之前
代码出错了
异常出现之后
总结:
NameError代表着可捕获未声明初始化变量异常。
NameError只会捕获NameError的异常,并不会捕获其他的异常。
演示3:
# print('异常出现之前')
# try:
# print(response)
# a = 1 / 0
# except ZeroDivisionError:
# print('ZeroDivisionError异常')
# except NameError:
# print('NameErrory异常')
# print('异常出现之后')
打印输出结果:
异常出现之前
NameErrory异常
异常出现之后
总结:
什么类型的异常先出现,就执行捕获什么异常。后续的异常将不再捕获。
演示4:
print('异常出现之前')
try:
print(response)
a = 1 / 0
print(1 + 'a')
except Exception as e:
print('类型错误', e, type(e))
print('异常出现之后')
打印输出结果:
异常出现之前
类型错误 name 'response' is not defined <class 'NameError'>
异常出现之后
- 语法:
try::
代码块(可能出错的代码):出错了就不执行,没有错就执行。
except:
代码块(出错了就执行的语句,没出错就不执行)
except Exception as e:
代码块(出现异常我们的处理方式)
finally:
代码块(是否有异常,都会执行)
注意 :except和finally至少有一个
四、打开文件
- 文件的打开:
- 文件(file)通过通过Python程序对计算机中的各种文件进行增删改查的操作。文件也叫I/O(input/output)
- 文件的操作:
- 1、打开文件
- 2、对文件进行各种操作(读、写、然后保存)
- 3、关闭文件
- 文件会有一个返回值。返回一个对象,这个对象就表示的当前文件。
演示1:
创建一个在目标目录内部的文件demo
file_name = 'demo'
response = open(file_name)
print(response)
打印输出结果:
<_io.TextIOWrapper name=‘demo’ mode=‘r’ encoding=‘UTF-8’>
演示2:Windows10绝对路径
file_name = 'D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十四将\demo'
response = open(file_name)
print(response)
D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十四将\demo–这个就是绝对路径。
演示3:macos结对路径
file_name = '/Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十四将/demo'
response = open(file_name)
print(response)
/Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十四将/demo–这个就是绝对路径。
演示4:相对路径
file_name = '..\第十四讲\demo'
response = open
print(response)
打印输出结果:
五、关闭文件
演示1:普通模式
- close()方法关闭文件
file_name = 'demo'
resp = open(file_name)
content = resp.read()
print(content)
# 关闭文件
resp.close()
print(resp.read())
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py
12580
Traceback (most recent call last):
File "/Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py", line 9, in <module>
print(resp.read())
ValueError: I/O operation on closed file.
演示2:升级模式
- with。。as语句不用写close()来关闭。带有自动关闭。
file_name = 'demo'
with open(file_name) as resp:
content = resp.read()
print(content)
respose = resp.read()
print(respose)
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py
Traceback (most recent call last):
File "/Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py", line 19, in <module>
respose = resp.read()
ValueError: I/O operation on closed file.
12580
演示3:高级模式
file_name = 'demo1'
try:
with open(file_name) as resp:
content = resp.read()
print(content)
except Exception as e:
print('没有这个文件', type(e))
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py
白日依山尽
黄河入海流
欲穷千里目
更上一层楼
六、读取文件
- 读取文件:
- 通过read()来读取文件的内容
- 调用open()来打开一个文件,可以将文件分为2中类型
- 一种 纯文本文件(使用utf-8编码编写的文件)
- 一种 二进制文件(图片 mp3 视频…)
- open()打开文件时,默认是以文本文件的形式打开的 open()默认的编码为None。所以处理文本文件时要指定编码
- 较大文件的读取:
- 通过read()读取文件内容时会将文件中所有的内容全部读取出来。如果对于读取的文件比较大的话。会一次性的将文件加载到内容中。容易导致内存泄露。所以对于较大的文件。不要直接调用read()。
- read()可以接收一个size作为的参数。该参数用来指定要读取字符的数量。默认值为-1.-1也就是要读取全部的内容。
- 每次读取都会从上次读取到的位置开始。如果字符的数量小于size。则会读取所有的。如果读取到最后的文件。则会返回空串。
- readline() 该方法用来读取一行。
- readline() 该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表当中返回。
演示1:
file_name = 'demo1'
try:
with open(file_name) as resp:
content = resp.read()
print(content)
except FileExistsError:
print(f'{file_name}文件不存在')
打印输出结果:
白日依山尽
黄河入海流
欲穷千里目
更上一层楼
-
open可以打开的文件类型:
- 1、纯文本(使用utf-8编写的文本文件)
- 2、别的二进制文件(图片、视频、音乐)
-
其他文件的读取方式: readline() 该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表当中返回。
演示:
file_name = 'demo1'
try:
with open(file_name) as resp:
for i in range(6):
content = resp.readline()
print(content,end='')
except FileExistsError:
print(f'{file_name}文件不存在')
七、文件的写入
- write()来向文件中写入内容
- 该方法可以分多次向文件写入内容。
- 写入完成之后该方法会返回写入字符的个数
- 使用open()函数打开文件时,必须要指定打开文件要做的操作(读、写、追加)。如果不指定操作类型,则默认是读取文件,而读取文件是不能想文件中写入。
- r 表示只读
- w 表示可写。使用w写入文件时,如果文件不存在则会创建一个文件。如果文件存在则会覆盖原文件的内容。
- a 表示追加。
演示1:
file_name = 'demo1'
# 'w'是覆盖式写入的意思
try:
with open(file_name, 'w', encoding='utf-8') as resp:
content = resp.write('123\n')
content = resp.write('456\n')
content = resp.write('789\n')
except:
print('出错了')
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/9--文件的写入.py
Process finished with exit code 0
演示2:
file_name = 'demo1'
# 'a'是追加的意思
try:
with open(file_name, 'a', encoding='utf-8') as resp:
content = resp.write('123\n')
content = resp.write('456\n')
content = resp.write('789\n')
except:
print('出错了')
打印输出结果:
123
456
789
123
456
789
八、二进制文件
- 读取文本文件时,size是以字符为单位。读取二进制文件时,size是以字节为单位
- 我们用wb来写入二进制文件
演示:
file_name = r'/Users/wangjiaxin/Desktop/111.ncm'
# rb时读写二进制文件的意思
try:
with open(file_name, 'rb') as resp:
new_file = '124.mp3'
# print(resp.read())
# wb写入二进制文件
with open(new_file, 'wb') as f:
while True:
content = resp.read(1024*800)
if not content:
break
f.write(content)
except:
print('出错了')
因为格式 转换的问题,这个程序没有结果。