异常和文件处理
1:异常处理
- 程序运行中可能存在的错误,也就是报错
- 异常处理的主作用是在程序运行的时候不会报错,而是在出现异常的时候执行指定的语句
- 程序在运行过程中可能会出现一些错误。比如: 使用了不存在的索引,两个不同类型的数据相加…这些错误我们称之为异常
- 处理异常 程序运行时出现异常,目的并不是让我们的程序直接终止!Python是希望在出现异常时,我们可以编写代码来对异常进行处理
##1.1:异常的处理(捕获异常) - 把可能出错的代码找出来,同时指出出错代码的解决方法
语法:
try: # try:尝试
可能出错的代码
except <异常名1:要处理的异常>: # except:除了
<语句块:异常处理语句>
except<异常名2:要处理的异常>:
<语句块:异常处理语句>
......
else:
<语句块:未触发异常,执行该语句>
finally: # finally:最后
<语句块:始终执行该语句,一般为了达到释放资源的目的>
- 异常处理语句流程图:
1.1:捕获异常的特性
- 在捕获到异常之后,直接去到相应的处理语句处,处理异常,执行异常处理语句,不会再去执行异常语句之后的语句
2:异常的传播
- 在调用函数的时候,如果函数体内出现了异常,那么就会把异常传递给调用的语句
- 一般发生在函式的调用处
- 当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会在进行传播。如果函数中没有对异常进行处理,则异常会继续向函数调用传播。如果函数调用处处理了异常,则不再传播异常,如果没有处理则继续向调用处传播。直到传递到全局作用域(主模块)如果依然没有处理,则程序终止,并显示异常信息。
- 当程序运行过程中出现异常以后,所有异常信息会保存到一个异常对象中。而异常传播时,实际上就是异常对象抛给了调用处
2.1:异常传播的处理
- 1:直接解决异常的源头错误
- 2:在调用异常函数的调用处,处理异常
- 两者都可以处理所用的异常,因为在调用处处理和在异常的源头处理异常的本质相同,只不过是形式不同*
2.2:没有处理异常语句
- 那么异常的语句报错会一直传播,直到传播到主函数,若在传播过程中有一处地方解决了异常,则不会报任何错误
3:异常处理语句的本质
- 异常的报错是一个类,所用报错异常的父类:Exception类
3.1:书写所用异常的缺点
- 需要写出所有的异常报错,这样太过于繁琐
语法:
try:
<可能出现异常的代码>
except <出现错误的类型1>:
<提示错误的类型1>
except <出现错误的类型2>:
<提示错误的类型2>
except <出现错误的类型3>:
<提示错误的类型3>
except <出现错误的类型4>:
<提示错误的类型4>
except <出现错误的类型5>:
<提示错误的类型5>
......
当有多个异常时,在捕获到第一个异常的时候,会直接跳转到相应的处理语句处,不会执行该语句下面的异常语句
3.2:通常处理异常的方法
- 直接调用Exception类
- 语法:
try:
<可能出现异常的代码>
except exception as e:
print(e, type(e))
好处:知道错误和错误的类型
4:文件的处理
- 文件(file) 通过Python程序来对计算机中的各种文件进行增删改查的操作 文件也叫I/O(Input/Output)
- 文件操作的步骤
1:打开文件
2:对文件进行各种操作(读、写)然后保存
3:关闭文件 - 若没有关闭文件,则会占用内存,会影响代码的运行性
- 文件会有一个返回值。返回一个对象,这个对象就表示的是当前的文件
4.1:打开文件
4.1.1:准备一个文件
- 需要对一个文件对象进行操作
- 需要使用open()函数
open(file, mode="r", encoding=None)
- open函数的主要参数,都需要指定的参数
1:file:文件对象
2:mode:对文件的具体操作
3:encoding:文件的编码格式
4.1.2:如何打开文件
- open()函数打开文件的目录,默认是在和该程序相同的同一个文件夹下找
- 若不在一个文件下,则要使用***绝对路径***来打开要打开的文件,再输入绝对路径时要使用原意字符“R或r”
- 绝对路径的查找 copy path
- open()函数中相对路径是无法打开文件的
4.2:文件的关闭
- 对打开的文件进行关闭操作
- 在文件关闭之后,需要在打开依次来确认文件是否真的关闭了
- 使用close()函数可以关闭指定的函数
4.2.1:使用with语句关闭文件
- with…as 语句不用写close()来关闭。它自带关闭
- 语法:
with open(文件的地址, "对文件的操作", "文件的编码形式") as new_name:
new_name.read() --->读取文件
使用print()函数打开的只是一个文件的文件流
5:对文件的操作
- 对文件的具体方法
5.1:文件的读取
- 通过read()来读取文件的内容
- 1:使用read()函数来读取文件
- 2:统一使用“utf-8”的解码格式,养成习惯,因为不会出错
5.1.1:对不同文件类型的读取操作
- 调用open()来打开一个文件,可以将文件分为2中类型
- 1: 一种 纯文本文件(使用utf-8编码编写的文件)
- 2: 一种 二进制文件(图片 mp3 视频…)
- 3:open()打开文件时,默认是以文本文件的形式打开的 open()默认的编码为None。所以处理文本文件时要指定编码
5.1.2:分批量读取
- 通过read()读取文件内容时会将文件中所有的内容全部读取出来。如果对于读取的文件比较大的话。会一次性的将文件加载到内容中。容易导致内存泄露。所以对于较大的文件。不要直接调用read()
#####可以指定read()方法里面的size()来确定读取的字节数 - read()可以接收一个size作为的参数。该参数用来指定要读取字符的数量。默认值为-1.-1也就是要读取全部的内容
- 每次读取都会从上次读取到的位置开始。如果字符的数量小于size。则会读取所有的。如果读取到最后的文件。则会返回空串
- readline()方法:
一行一行的读 - readlines()方法:
一行一行的读,会读取完所有的内容,并且放在列表中
6:文件的写入
- open()函数中的参数mode默认为只读“r”,如果要在文件中写入东西需要改变参数的类型
6.1:纯文本的写入操作
- 文件写入需要的方法:write()方法
write(“只能写入str类型,不能写入其它的类型”) - write()来向文件中写入内容
该方法可以分多次向文件写入内容
写入完成之后该方法会返回写入的字符的个数 - 语法:
with open(file_name, "w", encoding="utf-8") as f
f.writh("abc")
- 注意:“w”的操作方法是重写,也就是会覆盖以前写的内容,但是一次性写入的东西不会覆盖,关闭文件之后,再写入东西就会覆盖
- 使用open()函数打开文件时,必须要指定打开文件要做的操作(读、写、追加)。如果不指定操作类型,则默认是读取文件,而读取文件是不能向文件中写入
1:r 表示只读
2:w表示可以写。使用w写入文件时,如果文件不存在则会创建一个文件。如果文件存在则会覆盖原文件内容
常见文件的操作格式
操作方法 | 描述 |
---|---|
r | 以只读形式打开文件,文件的指针将会放在文件的开头 |
w | 以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有的内容,文件指针放在文件的开头 |
a | 以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件的末尾追加内容,文件指针在原文件末尾 |
b | 以二进制模式打开文件,不能单独使用,需要与其它模式一起使用,rb或者wb,声音、视频和图片都是二进制类文件 |
+ | 以读写模式打开文件,不能单独使用,需要与其它模式一起使用,a+ |
文件操作的常用方法
方法名 | 描述 |
---|---|
read(size) | 从文件中读取size个字节或字符的内容返回,若省略([size]),则读取到文件末尾,即一次读取文件的全部内容 |
readline() | 从文件中读取一行的内容 |
Readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write() | 将字符串str内容写入文件 |
writelines(s_list) | 将字符串列表s_list写入文本文件,不添加换行符 |
6.2:二进制文本的写入操作
- 读取文本文件时,size是以字符为单位。读取二进制文件时,size是以字节为单位
- 打开文件或操作文件需要使用文件的地址,而地址需要使用原意字符
- 读取:
二进制的读取需要使用“rd”操作,只用字节读,1024为1M
二进制的写入需要使用“wd”操作,只用字节读,1024为1M
6.2.1:将读取的二进制文件,重新写入另一个文件
- 需要使用with循环
课外知识
- 声音文件的后缀名有:mp3、mp4