异常
异常的传播
- 程序在运行的过程当中,不可以避免的出现一些错误,这些错误我们称之为异常,异常之后的代码都不会执行,防止异常的传播。
- 处理异常 try语句
try:
代码块(可能出现错误的语句)
except:
代码块(出现错误之后要执行的语句)
else:
代码块(没有出现错误我要执行的语句)
print('python')
try:
print(b)
except:
print('出错了')
else:
print('程序正常执行没有错误')
print('jkjkjkl')
python
出错了
jkjkjkl
异常的传播
- 当在函数中出现了异常,如果对异常进行处理,则异常不在继续传播,如果在函数中没有处理,则异常会继续向函数调用处传播
def fn():
print('我是fn')
print(100/0)# division by zero
#fn()# division by zero
异常从函数的内部传播到了函数的外部
def fn1():
print('我是fn1')
print(100/0)# division by zero
def fn2():
print('我是fn2')
fn1()
def fn3():
print('我是fn3')
fn2()
# fn3()# division by zero
print(ZeroDivisionError)
<class 'ZeroDivisionError'>
直到传递到全局作用域,如果依然没有处理则程序终止,并且显示异常信息,当这个程序在运行过程中出现异常,所有的异常信息会保存到一个专门的异常对象中,而异常传播时,实际上就是异常对象抛给了调用处
异常对象
- 怎么获取异常的对象?
print('异常出现前')
try:
# print(b)
print(100/0)
except NameError:
# 如果在except后面不加任何的内容,此时他会捕获所有的异常
# 如果在except后面跟着一个异常类型,那么他只会捕获该类型的异常
print('出现了NameError错误了')
print('异常出现后')
print('出现异常前')
try:
print(b)
except Exception as e:
print('.......',e,type(e))
finally:
print('无论是否出现异常,都会执行')
print('出现异常后')
出现异常前
....... name 'b' is not defined <class 'NameError'>
无论是否出现异常,都会执行
出现异常后
所有的异常都有同一个父类:Exception
此时的try语句:
try:
代码块(可能出现的错误的语句)
except 异常类型 as 异常名:
代码块(出现错误以后我的处理方式)
except 异常类型 as 异常名:
代码块(出现错误以后我的处理方式)
except 异常类型 as 异常名:
代码块(出现错误以后我的处理方式)
except 异常类型 as 异常名:
代码块(出现错误以后我的处理方式)
.........
else:
代码块(没有出错我要执行的语句)
finally:
代码块(不管代码块是否异常,该代码块都会执行)
文件File
文件又称为(I/O)(Input/Output)
- 操作文件的步骤:
1.打开文件
2.对文件进行读写操作
3.关闭文件
文件的打开
- 通过python程序来对计算机中的各种文件进行增删改查的操作
- 通过open()函数来进行打开文件
语法:
open(file,mode = ‘r’,buffering = None,encoding = None,errors = None,newline = None,closefd = True)
参数file 要打开的文件的名字(路径)
open()函数有一个返回值,返回的是一个对象,返回的是当前打开的文件
如果要打开的文件在py文件的同一目录下
file_name = 'demo.txt'
file_obj = open(file_name)
print(file_obj)
<_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>
如果要打开的文件和py文件不在同一个目录中
file_name = r'C:\Users\张浩哲\Desktop\demo.txt'
file_obj = open(file_name)
print(file_obj)
<_io.TextIOWrapper name='C:\\Users\\张浩哲\\Desktop\\demo.txt' mode='r' encoding='cp936'>
文件的关闭
- 当我们获取了文件对象之后,所有的操作都是通过文件对象来进行操作的
- 读取文件的内容,通过read()函数来读取文件内容,它会将读取到的内容保存到一个字符串当中
- 关闭文件:file_obj.close()
file_name = 'demo.txt'
file_obj = open(file_name)
content = file_obj.read()
print(content)
file_obj.close()
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
with…as语句:可以避免因为代码过多忘记关闭文件
file_name = 'demo.txt'
with open(file_name) as file_obj:
# 在with语句中直接使用file_obj来操作文件
print(file_obj.read())
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
file_name = 'python'
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) as file_obj:
content = file_obj.read()
print(content)
except FileNotFoundError:
print(f'{file_name}文件不存在')
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
如果要读取的文件是英文字母,那么可以顺利的读取出来,但是如果是中文呢?
file_name = 'demo2.txt'
try:
with open(file_name) as file_obj:
content = file_obj.read()
print(content)
except FileNotFoundError:
print(f'{file_name}文件不存在')
就会进行报错
这是因为调用open()来打开一个文件,打开的文件可以分为两种类型:
- 一种是纯文本(utf-8编写的文本文件)
- 一种是二进制文件(图片 音频 视频 PPT)
如何解决这个报错呢?
可以在file_name后去指定一个文件的编码,比如说utf-8 utf-16 utf-32 gbk等等
解决这个问题后,我们发现读取文本文件的时候如果字符占用过大,那么所占的内存也比较多,这时我们并不希望一下就可以读取全部的字符,这样做比较有隐患,那么怎么解决这件事呢?
这时要介绍一个函数read() - read()可以接受一个size作为参数来进行传递
- 默认值为-1会读取所有的字符,该参数用来指定读取字符的数量
- 可以为size指定一个值,这样read()会读取指定的数量的字符,并且每一次读取的时候都是从上一次读取的位置来继续进行读取,如果剩余字符的数量小于size,则一下读取剩余的内容
file_name = 'demo2.txt'
try:
with open(file_name,encoding = 'gbk') as file_obj:
# help(file_obj.read)
content = file_obj.read(6)
print(content)
print(len(content))
except FileNotFoundError:
print(f'{file_name}文件不存在')
靠靠靠靠靠靠
6
这样一来就避免了隐患。
file_name = 'demo.txt'
try:
with open(file_name,encoding = 'utf-8') as file_obj:
# 定义一个变量来保存结果
file_content = ''
# 定义一个变量来指定读取的大小
chunk = 5
while True:
content = file_obj.read(chunk)
# 没有内容退出循环
if not content:
break
file_content += content
except FileNotFoundError:
print(f'{file_name}文件不存在')
print(file_content)
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
file_name = 'demo.txt'
with open(file_name,encoding = 'utf-8') as file_obj:
# print(file_obj.read())
# readline()该方法可以读取一行内容
print(file_obj.readline(),end = '')
print(file_obj.readline(),end = '')
print(file_obj.readline(),end = '')
# readlines()该方法用于一行一行的读取,他将读取的内容全部封装到一个列表当中进行返回
r = file_obj.readlines()
print(r)
print(len(r))
print(r[0])
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
[',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n', 'llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll']
2
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
文件的写入
- 通过write()向文件中写入内容,如果操作的是一个文本文件,write()需要传递一个字符串,操作文件的时候要指定操作的类型
- w表示可写,使用w写入文件的时候,如果文本不存在会创建一个文件,如果存在会覆盖原文件
file_name = 'demo.txt'
with open(file_name,'w',encoding = 'utf-8') as file_obj:
file_obj.write('nice to meet you')
nice to meet you
如何在文件中进行追加呢?a表示追加
file_name = 'demo.txt'
with open(file_name,'a',encoding = 'utf-8') as file_obj:
file_obj.write('nice to meet you\n')
file_obj.write('dfadfadgg\n')
file_obj.write('13243544\n')
file_obj.write('gsdfgsdfgsf\n')
file_obj.write('hkkkkl;l;iulouk\n')
nice to meet younice to meet you
dfadfadgg
13243544
gsdfgsdfgsf
hkkkkl;l;iulouk
操作二进制文件
b表示操作二进制文件
rb表示读取二进制文件
wb表示写入二进制文件
ab表示追加二进制文件
file_name = r'C:\Users\张浩哲\Desktop\果汁音乐-只听最动听的歌.mp3'
with open(file_name,'rb') as file_obj:
# print(file_obj.read(100))
# 定义一个新的文件
new_name = 'abc.mp3'
with open(new_name,'wb') as new_obj:
# 定义一个读取的大小
chunk = 1024 * 100
while True:
content = file_obj.read(chunk)
if not content:
break
new_obj.write(content)