1.异常
程序在运行过程中不可避免出现的错误。
比如直接print(abc),哈哈哈
比如引用了没有赋值的变量和超出索引…
这些错误我们称之为“异常”
程序一旦出现异常,会导致程序立即终止!!! 异常后面的代码都不会执行
@@@ 处理异常
出现异常程序停止,是希望我们编写相应的代码对异常进行处理。
以下组合处理手段可以用(try except else),我的老师告诉我说,这叫“试婚哦”!啊哈哈哈。
这里的else 是不出错也会执行的,跟if …else 的else不同哦。
运行结果,hallo , 2.0 , java
以下是出错情况的运行结果,因为6/0会出错
有错误时,else 语句块不会执行
2.异常的传播
print(6/0) #相当于在全局先来了个报错
def fn():
print('hello fn')
fn()
#如果在函数中,对异常进行了处理,则异常不会再继续传播;下面是没有处理,所以会传播给函数调用处,即继续向函数调用处传播,谁调用它,就传谁( fn()好惨,哈哈哈! )
def fn():
print('hello fn')
print(6/0) #设置的异常
fn()
#如果在函数中,对异常进行了处理,则异常不会再继续传播;下面是没有处理,
def fn():
print('hello fn')
print(6/0) #设置的异常
try:
fn()
except:
pass
下面看一个复杂一些的,因为没有及时处理,产生了连锁报错:
23异常(zerodivisionerror)、–>fn2、–>fn3、–>fn 全局
【以上总结】当程序在运行过程中,出现了异常以后,所有异常信息会被保存到一个专门异常对象中,而异常进行传播时,其实就是异常抛给了调用处。
3.异常对象
Print('异常出现前')
try:
print(abc) #是异常1 NameError
print(6/0) #是异常2 ZeroDivisonError
except NameError:
#如果except后面不跟任何内容,则此时他会捕获所有的内容
#如果except后面跟着一个异常类型,它只会捕获该类型的异常,如此例子跟的是NameError类型,则会忽略非NameError类型的异常哦。
print('处理异常的逻辑...')
print('异常出现后')
但是一个个专门对应去捕获也很麻烦对吧!
try:
print(abc) #是异常1 NameError
print(6/0) #是异常2 ZeroDivisonError
except Exception as e:
print('出现异常了','e')
运行结果如下
结合finally的用法:
Print('异常出现前')
try:
print(abc) #是异常1 NameError
print(6/0) #是异常2 ZeroDivisonError
except Exception as e:
print('出现异常了','e')
finally:
print('无论有没有异常,哥们都执行')
print('异常出现后')
运行结果如下
4.文件
通过python程序对计算机中的各种文件进行增删改查的操作 I/O(Input/Output)
正常的人为操作文件流程:
- 打开
- 操作文件(读写)、保存
- 关闭
那么程序怎么做呢?
1.open() 这个内置函数,file是参数(文件或路径), 后面的全是关键字。
#Open() file 是要打开文件的名字或路径
file_name='demo.txt'
open(file_name) #注意open()函数是由返回值的,就是当前打开的文件
同理:路径方式,但是注意小细节如下图:
读取内容 用到 read() 方法,读取文件内容,以字符串来返回。
2.close() 方法,关闭文件
如果关闭后没有报错,说明没有关文件哦,因为正常要打开才能读
当代码多,可能遗忘 close 或者open等。所以用一行语句来做:
with…as语句,合并几行来写的
#一旦with…as语句结束,文件自动关闭
with open(file_name) as file_obj #file_obj 是文件打开函数的返回值
print(file_obj.read())
举例 abc.txt是不存在的,那么看怎么报错。
所以标准版本文件代码: 用到了格式化字符串
3.读取文件
文件类型:
1.纯文本 utf-8 GBK等 (英文纯文本ascII ,python是可以直接解析的,而中文纯文本不能解析,所以必须用encoding关键字指定)
- 二进制文件 如 音频、视频、音乐MP3、图片
open()函数默认打开的是纯文本
用**
read()
read()可以接受一个size作为参数,该参数用来指定读取字符的数量,默认值为-1(即-1是全部内容)
**读取内容时,会直接将全部内容读取出来,如果是读取一个较大文件,会一次性加载到内存中,很容易导致内存溢出。
较大文件怎么解决呢? 不要直接调用read()。
用help来解决,注意help()中read不能跟括号,否则是调用方法呢,而不是对象啊,要报错的。
看看这个size -1的样子
重复的语句,是会读取后续的指定数量的字符。每一次都是从上次读取位置接着读取。
size 设置6, 因为古诗前三行带回车,第四行不换行了,所以没有回车计算。
运行结果是:
下图又死循环了,没有设置字数
判断以下,没有内容了,break一下即可:
end=’’ # 换行
4.其他的读取方式
正常方式
读取一行的 readline 方法:
带s的方法几乎都会将所有内容放到列表中返回。
运行结果是 [ #,$,%,^,&,* ]
5.文件的写入 write()
不指定操作类型,则默认为读取文件,不能直接写入内容,下图报错
指定w ,表示指定写入操作。
其他一些写的参数
其中a表示追加内容
write 必须是字符串,不符合的可以处理下,转换类型
处理结果
write()有返回值的,实验证明,返回的是写入字符的个数(含换行符 \n )
其他一些写的参数
本节回顾