程序在运行过程中不可避免的会出现一些错误,比如使用了没有赋值过的变量、使用了不存在的索引、除0等。这些错误在程序中称其为异常,在程序中出现异常会导致程序立即终止,异常以后的代码全部都不会执行。
程序运行时出现异常,目的不是让程序直接终止,而是希望在出现异常时可以编写代码对异常进行处理。
try:
代码块(可能出现错误的语句)
except:
代码块(出现错误以后的处理方式)
else:
代码块(没出错时要执行的语句)
可以将可能出错的代码放到try子句中,这样如果代码没有错误则会正常执行,如果出现错误则会执行expect子句中的代码,这样就可以通过代码来处理异常,避免因为一个异常导致整个程序的终止。
当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播,如果在函数中没有对异常进行处理,则异常会继续向函数调用处传播,如果函数调用处处理了异常,则不再传播,如果没有处理则继续向调用处传播,直到传递到全局作用域(主模块)如果依然没有处理,则程序终止并显示异常信息。
当程序运行过程中出现异常以后,所有的异常信息会被保存到一个专门的异常对象中,而异常传播时,实际上就是异常对象抛给了调用处。
raise用于向外部抛出异常,后边可以跟一个异常类或异常类的实例,其目的是告诉调用者这里调用时出现问题。
def add(a,b):
if a < 0 or b < 0:
raise Exception('两个参数中不能有负数')
r = a + b
return r
print(add(-1,2))
1.如果在except后不跟任何内容,则此时它会捕获到所有的异常,如果在except后跟一个异常类型,则此时它只会捕获该类型的异常。
2.Exception是所有异常类的父类,所以如果except后跟的是Exception,则会捕获到所有的异常。
3.可以在异常类后跟着一个as xx,此时xx就是异常对象。
4.finally子句无论是否出现异常,该子句都会执行。
使用open()函数来打开一个文件,可以将文件分成两种类型,一种是纯文本文件,一种是二进制文件,默认打开的是纯文本文件(编码为None),所以在处理文本文件时必须要指定文件的编码。
1.file:表示要打开文件的名字(路径),可以使用..来返回一级目录,如果目标文件距离当前文件较远,此时可以使用绝对路径。
2.返回值:返回一个代表当前打开文件的对象。
open('demo.txt')
当我们获取到文件对象以后,所有对文件的操作都应该通过对象来进行。
read()方法用来读取文件中的内容,它会将内容全部保存为一个字符串返回。
调用close()方法关闭文件。
file_obj.close() # 直接关闭文件
'''
在with语句中可以直接使用file_obj来做文件操作,此时这个文件只能在with语句中使用,一旦with语句结束则文件会自动关闭
'''
file_name = 'hello'
try:
with open(file_name) as file_obj:
print(file_obj.read())
except FileNotFoundError:
print(f'{file_name}文件不存在')
file_name = 'demo.txt'
try:
with open(file_name,encoding = 'UTF-8') as file_obj:
content = file_obj.read()
print(content)
except FileNotFoundError:
print(f'{file_name}文件不存在')
如果直接调用read(),它会将文本文件的所有内容全部都读取出来,如果要读取的文件较大的话,会一次性将文件的内容加载到内存中,容易导致内存泄露。
read()可以接收一个size作为参数,该参数用来指定要读取的字符数量,默认值为-1,会读取文件中的所有字符。可以为size指定一个值,这样read()会读取指定数量的字符,每一次读取都是从上次读取到的位置开始读取的,如果字符的数量小于size,则会读取所有字符,如果已经读取到文件的最后,则会返回‘空串’。
file_name = 'demo.txt'
try:
with open(file_name,encoding = 'UTF-8') as file_obj:
# 定义一个变量,来指定每次读取的大小
step = 50
# 创建一个循环来读取文件内容
while True:
# 读取step大小的内容
content = file_obj.read(step)
# 检查是否读取到了内容
if not content:
# 内容读取完毕
break
print(content,end='')
except FileNotFoundError:
print(f'{file_name}文件不存在')
该方法可以用来读取文件中的一行数据。
file_name = 'demo.txt'
try:
with open(file_name,encoding = 'UTF-8') as file_obj:
# 定义一个变量,来指定每次读取的大小
step = 50
# 创建一个循环来读取文件内容
while True:
# 读取step大小的内容
content = file_obj.readline(step)
# 检查是否读取到了内容
if not content:
# 内容读取完毕
break
print(content,end='')
except FileNotFoundError:
print(f'{file_name}文件不存在')
该方法用于一行一行读取内容,会一次性将读取到的内容封装到一个列表中返回。
file_name = 'demo.txt'
try:
with open(file_name,encoding = 'UTF-8') as file_obj:
# 定义一个变量,来指定每次读取的大小
step = 50
# 创建一个循环来读取文件内容
while True:
# 读取step大小的内容
content = file_obj.readlines(step)
# 检查是否读取到了内容
if not content:
# 内容读取完毕
break
print(content,end='')
except FileNotFoundError:
print(f'{file_name}文件不存在')
使用open()打开文件时必须要指定打开文件所要做的操作(读、写、追加),如果不指定操作类型,则默认是读取文件,而读取文件时不能向文件中写入。
write()来向文件中写入内容,如果操作的是一个文本文件的话,则write()需要传递一个字符串作为参数,该方法可以分多次向文件中写入内容,写入完成后,该方法会返回写入的字符个数。
1.w表示可写,使用w来写入文件时,如果文件不存在会创建文件,如果文件存在会截断文件(删除原来文件中的所有内容)。
2.a表示追加内容,如果文件不存在会创建文件,如果文件存在则会想文件中追加内容。
3.x表示新建文件,如果文件不存在则创建,如果存在则报错。
4.+为操作符增加功能,比如r+(既可读又可写,文件不存在会报错)、w+、a+。
file_name = 'demo.txt'
with open(file_name,'w',encoding = 'UTF-8') as file_obj: # w会截断文件
file_obj.write('aaa\n')
file_obj.write('bbb\n')
file_obj.write('ccc\n')
file_obj.write(str(123) + '\n')
with open(file_name,'a',encoding = 'UTF-8') as file_obj: # a会追加内容
file_obj.write('aaa\n')
file_obj.write('bbb\n')
file_obj.write('ccc\n')
file_obj.write(str(123) + '\n')
b表示读取二进制文件,size是以字节为单位的。
with open(file_name,'rb') as file_obj:
print(file_obj.read())
1.tell()方法用来查看当前读取的位置。
2.seek()方法可以修改当前读取的位置。它需要两个参数,第一个是要切换到的位置,第二个是计算方式:可选值为0(从头计算,默认值),1(从当前位置计算),2(从最后位置开始计算)。
1.os.listdir():需要一个路径作为参数,会获取到该路径下的目录结构,默认路径为.即当前目录,会返回一个列表。
2.os.getcwd():获取当前所在的目录。
3.os.chdir():切换当前所在的目录,作用相当于cd。
4.os.mkdir("aaa"):在当前目录下创建一个名字为aaa的目录。
5.os.rmdir("aaa"):删除指定目录。
6.os.remove('aaa.txt'):删除指定文件。
7.os.rename('旧名字','新名字'):文件重命名。