文章目录
异常
1. 异常的简介
- 在程序的运行过程中出现的错误就是异常
- 异常会导致程序终止,异常以后的代码都不会去执行
- 异常处理
# try 语句结构
try:
代码块 # 可能出现错误的语句
except:
代码块 # 出现错误以后的处理方式
else: # 可选
代码块 # 没有出错要执行的语句
- 代码示例:
print('haha')
# b = 123
try:
print(b)
except:
print('error')
else:
print('code is right')
print('good')
2. 异常的传播
- 函数中出现了异常,如果进行了异常处理,异常不会传播
- 如果未对异常进行处理,则会继续向函数调用处传播
- 异常处理可以在函数内,也可以在全局
- 代码示例:
def fn1():
print('我是fn1')
print(100 / 0)
def fn2():
print('我是fn2')
fn1()
def fn3():
print('我是fn3')
fn2()
try:
fn3()
except:
pass
我是fn3
我是fn2
我是fn1
- 异常在函数间传播,直到传播到最外层调用函数处
- 实际上,异常信息会被存储在异常对象中,在异常传播时,异常对象会被抛给调用处
3. 异常对象
- 如果在except后不加任何内容,则会捕获所有的异常
- 异常的捕获是按照错误出现的先后顺序的
- 如果指定了except后的异常类型,则只有该类型的异常才会被处理。在try中该类型之前未被处理的异常仍会报错,但该异常程序之后的异常会被忽略
- 所有异常类型的父类是Exception
- 可以通过指定异常对象,打印异常内容和类型的方式获取具体异常的内容
- except Exception as e:
- print(e,type(e))
- except Exception as e:
- 代码示例:
print('异常出现前...')
try:
print(b)
print(100 / 0)
# 指定异常对象,并打印异常的内容和类型
except Exception as e:
print('抛出所有异常啦',e,type(e))
# except NameError:
# print('出现NameError的错误了')
# except ZeroDivisionError:
# print('出现ZeroDivisionError的错误了')
print('异常出现后...')
-
finally:
- 无论出现什么异常,我都会执行
-
所以完整的异常处理格式为:
try:
代码块 # 可能出现异常的代码
except 异常类型 as 异常名:
代码块 # 出现异常后的处理方式
else:# 当异常没有出现时执行
代码块
finally: # 无论是否出现异常,finally后的代码块都执行
代码块
文本文件的操作
1. 打开文件
- 打开文件
- open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)
- 返回值为当前打开的文件
- 参数file: 要打开的文件名
- 如果打开的文件不存在或错误,则会报错:
- FileNotFoundError: [Errno 2] No such file or directory: ‘dem12o.txt’
file_name = ‘demo.txt’ - 文件完整路径前最好加上r,防止转义\n等特殊字符
- open()默认是以纯文本文件(ASCII)打开,中文需要指定编码格式
# 打开文件
file_name = r'F:\python3.6程序\demo.txt'
# 返回值为当前打开的文件
file_obj = open(file_name) # _io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'
print(file_obj)
2. 读取文件内容
2.1 read()
- 文件对象.read()
- read(size=-1, /)
- size为指定读取字符的数量,默认值-1表示读取所有
- 可以为size指定与1个值,read()会读取指定数量的字符
- 每次读取均从上次读取后的位置来读取
- 如果剩余字符数量小于size,则一次读取剩余内容
- 返回内容为字符串
- 代码示例:、
file_name = r'F:\python3.6程序\demo.txt'
# 文件已打开,此后所有的操作都是通过文件对象进行操作
file_obj = open(file_name)
# 通过read()函数读取文件的内容,会返回一个str类型的字符串
content = file_obj.read()
print(content)
file_name = 'demo2.txt'
try:
with open(file_name,encoding='utf-8') as file_obj:
# 对较大文件应当限制一次读取的内容数量
# 为了避免一次性读取内容过多
file_content = ''
# 定义一个变量来读取指定的大小
chunk = 100
while True:
content = file_obj.read(chunk)
if not content:
break
file_content += content
# 打印如果放在循环内会导致多次打印,效率低
except FileNotFoundError:
print(f'{file_name}文件不存在')
# 最好把打印放在代码外边,一次打印出来
print(file_content)
2.2 readline()
- readline() 方法用于读取一行内容
- 可以通过循环输出内容
2.3 readlines()
- readlines() 方法用于逐行读取,返回每行的内容到列表中
- 可以通过循环或者遍历输出内容
3. 关闭文件
- 关闭文件的目标是为了释放资源
- 文件对象.close()
- 代码示例:
file_obj.close()
# 关闭以后,文件就无法读取了,报错
# ValueError: I/O operation on closed file.
file_obj.read()
4. 上下文管理器
- with … as …
- 通过上下文管理器实现自动关闭文件
file_name = r'F:\python3.6程序\demo.txt'
with open(file_name) as file_obj:
# 使用file_obj进行文件操作
print(file_obj.read())
# 自动close,不需要进行close()操作了
# 因为文件已经关闭,所以无法再读取
# ValueError: I/O operation on closed file.
print(file_obj.read())
5. 文件操作标准格式
- 文件操作应当加入打开文件找不到时的异常处理
file_name = 'xxx'
try:
with open(file_name) as file_obj:
文件对象操作代码块
except FileNotFoundError:
print(f'{file_name}文件不存在')
6. 文件的写入
6.1 ‘w’
- 文件打开模式’w’可写,只能传入字符串
- 如果文件不存在会自动创建文件
- 如果存在则覆盖后,向后写入
- 只有with open动作会覆盖,with open内的内容会继续向后追加
file_name = 'demo1.txt'
with open(file_name,'w',encoding='utf-8') as file_obj:
# write()向文件写入内容
# 如果写入的内容为文本,write()需要传递一个字符串
# 操作文件的时候要指定操作的类型
# file_obj.write('nice to meet you')
file_obj.write('abc\n')
file_obj.write('def\n')
file_obj.write('hij\n')
# 当传入数字时,由于不是字符串会报错,需要类型转换
# TypeError: write() argument must be str, not int
r = file_obj.write(str(666)+'\n')
# write的返回值为此次write()操作写入的字符数量
print(r)
with open(file_name,'r',encoding='utf-8') as file_obj:
file_content = file_obj.read()
print(file_content)
4
abc
def
hij
666
6.2 ‘a’
- ‘a’表示追加,在原有内容后继续追加数据
file_name = 'demo1.txt'
with open(file_name,'a',encoding='utf-8') as file_obj:
file_obj.write('123\n')
file_obj.write('456\n')
file_obj.write('789\n')
r = file_obj.write(str(666)+'\n')
with open(file_name,'r',encoding='utf-8') as file_obj:
file_content = file_obj.read()
print(file_content)
- 输出结果显示文件写入是在文件之前的内容后继续追加
abc
def
hij
666
123
456
789
666
6.3 ‘rb’和’wb’
- ’rb’读取二进制文件
- 音乐,图像,视频均为二进制文件
- 读取时注意限制read(size),避免一次性读取过多内容
- 'wb’写入二进制文件
- 代码示例:
file_name = r'F:\python3.6程序\平凡之路.mp3'
# 'rb'读取二进制文件
# 图像,音乐,视频均为二进制文件
with open(file_name,'rb') as file_obj:
# UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 111: illegal multibyte sequence
# print(file_obj.read(100))
# 定义一个新文件
newmp3_name = 'abc.mp3'
with open(newmp3_name,'wb') as newmp3_obj:
# 定义读取大小,读取100kb的数据
chunk = 100 * 1024
while True:
content = file_obj.read(chunk)
if not content:
break
newmp3_obj.write(content)