第十五讲:异常&文件
异常的简介
- 程序在运⾏过程中可能会出现⼀些错误。⽐如: 使⽤了不存在的索引,两个不 同类型的数据相加…这些错误我们称之为异常
- 处理异常 程序运⾏时出现异常,⽬的并不是让我们的程序直接终⽌!Python是希望在出现异常时,我们可以编写代码来对异常进⾏处理
'''
try语句
try:
代码块(可能出现错误的语句)
except 异常类型 as 异常名:
代码块(出现错误在之后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误在之后的处理方式)
....
else:
代码块(没出错误要执行的语句)
finally:
代码块(该代码总会被执行)
try 是必须的 else有没有都行
except和finally 至少有一个
'''
print('你好')
try:
print(10/2)
except:
print('兄弟,出错了!!')
else:
print('程序正常执行,没有错误')
print('hello')
异常的传播
- 当在函数中出现异常时,如果在函数中对异常进⾏了处理,则异常不会在进⾏传播。如果函数中没有对异常进⾏处理,则异常会继续向函数调用传播。
def fn():
print('我是fn')
print(10 / 0)
try:
fn()
except:
pass
- 如果函数调⽤处处理了异常,则不再传播异常,如果没有处理则继续向调⽤处传播。直到传递到全局作⽤域(主模块)如果依然没有处理,则程序终⽌,并显示异常信息。
- 当程序运⾏过程中出现异常以后,所有异常信息会保存到⼀个异常对象中。⽽异常传播时,实际上就是异常对象抛给了调⽤处。
def fn():
print('我是fn')
print(10 / 0)
def fn2():
print('我是fn2')
fn()
def fn3():
print('我是fn3')
fn2()
fn3()
异常对象
print('异常出现前')
lst = [123]
try:
lst + 0
print(10 / 0)
print(a)
except ZeroDivisionError:
print('出现ZeroDivisionError异常啦')
except NameError:
# except后面不跟任何的内容,它会捕获所有的异常
# except后面跟着一个异常的类型,那么此时它就会捕获该类型的异常
print('处理异常的逻辑')
print('出现NameError异常啦')
# Exception是所有异常类的父类,如果except后面跟的是Exception它会捕获所有的异常
except Exception as e:
print('出现异常啦.....',e,type(e))
finally:
print('无论是否出现异常,哥们都会执行...')
print('异常出现后')
注:几个except的级别无先后,执行哪一个看第一个出现的异常类型,是哪一个执行哪一个except
文件打开
- ⽂件(file) 通过Python程序来对计算机中的各种⽂件进⾏增删改查的操作,⽂件也叫I/O(Input/Output)
- ⽂件的操作步骤
- 打开⽂件
- 对⽂件进⾏各种操作(读、写)然后保存
- 关闭⽂件
- ⽂件会有⼀个返回值。返回⼀个对象,这个对象就表示的是当前的⽂件
file_name = 'demo.txt'
file_obj = open(file_name)
print(file_obj)
关闭文件
- 调⽤close()⽅法来关闭⽂件
- with…as 语句不⽤写close()来关闭,它⾃带关闭
file_name = 'demo.txt'
# with...as... 语句
try:
with open(file_name) as file_obj:
# 在with语句中可以直接使用file_obj来对文件进行操作
# 一旦with语句中的代码块结束会自动close()
print(file_obj.read())
except FileNotFoundError:
print(f'{file_name} 文件不存在')
print(file_obj.read())
读取文件
- 通过read()来读取⽂件的内容
- 调⽤open()来打开⼀个⽂件,可以将⽂件分为2中类型
- ⼀种 纯⽂本⽂件(使⽤utf-8编码编写的⽂件) open()默认的编码为None,所以处理文本⽂件时要指定编码,如utf-8
注:demo2.txt文件中的文本内容为“关关雎鸠\n在河之洲\n窈窕淑女\n君子好逑”
file_name = 'demo2.txt'
try:
with open(file_name,encoding='utf-8') as file_obj:
# 通过read()来读取文件中的内容
# 如果直接调用read()来读取文件的内容,它会将文件的内容全部读取
# read()函数可以接收一个size作为参数,该参数用来指定读取字符的数量
# 默认为-1 就会读取所有的内容
# help(file_obj.read)
content = file_obj.read(5)
content = file_obj.read(5)
content = file_obj.read(5)#每次读取的内容会替代上次的内容
content = file_obj.read(6)#如果size大于文件内文本量,则只读取全部文本不报错
print(content)
except FileNotFoundError:
print(f'{file_name} 文件不存在')
- ⼀种 ⼆进制⽂件(图⽚ mp3 视频…)
较大文件的读取
- 通过read()读取⽂件内容时会将⽂件中所有的内容全部读取出来。如果对于读取的⽂件⽐较⼤的话。会⼀次性的将⽂件加载到内容中。容易导致内存泄露。所以对于较⼤的⽂件,不要直接调⽤read()
- read()可以接收⼀个size作为的参数。该参数⽤来指定要读取字符的数量。默认值为-1.-1也就是要读取全部的内容
- 每次读取都会从上次读取到的位置开始。如果字符的数量⼩于size。则会读取所有的。如果读取到最后的⽂件。则会返回空串
file_name = 'demo.txt'
try:
with open(file_name,encoding='utf-8') as file_obj:
# 定义一个变量,来指定每次读取的大小
chunk = 100
# 创建一个循环来读取内容
while True:
content = file_obj.read(chunk)
# 退出循环
if not content:
# 内容读取完毕
break
print(content)
except FileNotFoundError:
print(f'{file_name} 文件不存在')
- readline() 该⽅法⽤来读取⼀⾏
- readlines() 该⽅法⽤于⼀⾏⼀⾏的读取内容,它会⼀次性将读取到的内容封装到⼀个列表当中返回
注:demo.txt文件中的内容为“ning\n chang\n jiu”
file_name = 'demo.txt'
with open(file_name) as file_obj:
# print(file_obj.read())
# readline() 用来读取一行
# print(file_obj.readline(),end='')
# print(file_obj.readline())
# readlines() 该方法一行一行读取,将结果返回到一个列表
r = file_obj.readlines()
print(r)
文件的写入
- write()来向⽂件中写⼊内容
- 该⽅法可以分多次向⽂件写⼊内容
- 写⼊完成之后该⽅法会返回写⼊的字符的个数
- 使⽤open()函数打开⽂件时,必须要指定打开⽂件要做的操作(读、写、追 加)。如果不指定操作类型,则默认是读取⽂件,⽽读取⽂件是不能向⽂件中写⼊
- r 表示只读
- w表示可以写。使⽤w写⼊⽂件时,如果⽂件不存在则会创建⼀个⽂件;如果⽂件存在则会覆盖原⽂件内容
file_name = 'demo3.txt'
# with open(file_name,'w',encoding='utf-8') as file_obj:
with open(file_name, 'a', encoding='utf-8') as file_obj:
# w 表示的是可写 使用w写入文件的时候,如果文件不存在就会创建文件并写入内容,如果文件存在则会覆盖原文件的内容
# a 表示的是追加
# write()向文件写入内容
# file_obj.write('大家好\n')
# file_obj.write('abc\n')
# file_obj.write('bcd\n')
# file_obj.write(str(456))
file_obj.write('hahaha')
file_obj.write('heiheihei')
二进制文件的写入
- 读取⽂本⽂件时,size是以字符为单位。读取⼆进制⽂件时,size是以字节为单位
- 我们用rb来读取二进制文件,用wb来写⼊⼆进制⽂件
file_name=r'C:\Users\地久天长\Desktop\谭咏麟 - 一生中最爱.mp3'
with open(file_name,'rb') as file_obj:
new_name='一生中最爱.mp3'
with open(new_name,'wb') as new_obj:
chunk=1024*1000
while True:
count=file_obj.read(chunk)
if not count:
break
new_obj.write(count)