一、错误和异常
- 错误:Error,一些关于语法的错误【缩进】
- 异常:Exception,代码完全正确,但是,程序运行之后,会报错的错误
- 异常特点:当程序在执行的过程中遇到异常,程序将会终止在出现异常的代码处,代码不会继续向下执行。
1.1 常见的异常
SyntaxError:语法错误
NameError:变量未被定义
IndexError:下标越界
TypeError:类型错误
ZeroDivisionError:除0错误
AttributeError:属性异常
UnboundLocalError:试图访问一个还未被设置的局部变量
ImportError:导入模块的时候路径异常
1.2 异常处理
- 方法:捕获异常、抛出异常
- 作用:防止代码报错,导致后面的程序无法执行
1.2.1 捕获异常
1. try-except-else
- 工作原理:首先执行try中的语句,如果try中的语句没有异常,则直接跳过所有的except语句,执行else;如果try中的语句有异常,则去except分支中进行匹配错误码,如果匹配到了,则执行except后面的语句;如果没有except匹配,则异常仍然没有被拦截【屏蔽】
- 不带异常类型:
try: a = 10/0 print(a) except: print('报错了') - 带有错误类型:
try: a = 1/0 print(a) except Exception as e: print('报错了',e) # 报错了 division by zero else: print("未出错") - 总结:
a.一个try语句后面可以有多个except分支
b.不管try中的代码有多少个异常,except语句都只会被执行其中的一个,哪个异常处于try语句的前面,则先先执行对应的except语句
c.后面的异常不会报错【未被执行到】
d.try中不仅可以直接处理异常,还可以处理一个函数中的异常
2. try-except-finally
- 不管try中的语句是否存在异常,不管异常是否匹配到了except语句,finally语句都会被执行
try: a = 1/0 print(a) except Exception as e: print('报错了',e) # 报错了 division by zero finally: print("不管有没有出错,我都会在最后执行") - 注意:当在try或者except中出现return语句时,finally语句仍然会被执行
def show(): try: print(10 / 0) # division by zero return except ZeroDivisionError as e: print(e) finally: print("finally被执行~~~~") show()
1.3 抛出异常(raise):
- raise :抛出一个指定的异常对象,让程序报错。
- 语法:raise 异常对象 或者 raise.。raise NameError(“这是我抛出的错误!”)。
- 说明:异常对象通过错误表示码创建,一般来说错误表示码越准确越好。
通过raise抛出的异常,最终还是需要通过try-except处理
- 直接抛出异常
try: raise NameError("错误") except NameError as e: print(e) - 如果通过raise抛出的异常在try中不想被处理,则可以通过raise直接向上抛出
try: raise NameError("hjafhfja") except NameError as e: print(e) raise
1.4 断言assert
- assert:关键字对某个问题做一个预测,如果预测成功,则正常执行程序获取结果;如果预测失败,则抛出预测的错误信息
def f(n): # 预测n!=0: assert n != 0,'n不能为0' a = 1/n print(a) f(0)
二、文件重写
- 在Python中,通过打开文件生成一个文件对象【文件描述符】操作磁盘上的文件,操作主要有文件读写
- 文件操作步骤;
1、打开文件
2、操作文件:写、读
3、关闭文件最后一定不要忘了文件关闭,避免系统资源的浪费【因为一个文件对象会占用系统资源】
2.1 打开文件
语法:open(path,flag[,encoding,errors])
path:指定文件的路径【绝对路径和相对路径】
flag:打开文件的方式
encoding:编码格式:gbk,utf-8
errors:错误处理fp = open('test.txt','r',encoding='utf-8')fp:文件句柄,指向指定文件的对象
打开文件的方式:
r:只读,如果文件不存在则报错
fp = open('test.txt','r',encoding='utf-8')rb:只读二进制,如果文件不存在则报错
fp = open('test1.txt','rb')w:清空写,如果文件不存在则自动创建文件
fp = open('test1.txt','w',encoding='utf-8')wb:清空写二进制,如果文件不存在则自动创建文件
a:追加写,在文件末尾追加,如果文件不存在,会自动创建
ab:追加写二进制,在文件末尾追加,如果文件不存在,会自动创建
fp = open('test1.txt','ab')注意:
1、 以r的方式打开文件时,encoding是不是必须出现?
如果文件格式为gbk,可以不加encoding=“gbk”;
如果文件格式为utf-8,必须添加encoding=“utf-8”。
2、如果打开的文件是图片,音频或者视频等,打开方式采用rb,但是,此时,不能添加encoding=“xxx”。
2.2 读取文件read:
1.读取全部内容
str = fp.read()
print(str)2.读取指定的字符数
注意:如果每一行的结尾有个"\n",也被识别成字符
str1 = fp.read(2) print(str1)3.读取整行,不管该行有多少个字符
str2 = fp.readline() print(str2)4.读取一行中的指定的字符
str3 = fp.readline(3) print(str3)读取所有行,输出列表(每行作为一个元素,包括换行符)
str4 = fp.readlines() print(str4)
2.3 写:write
- 注意:将数据写入文件的时候,默认是没有换行的,如果想换行,则可以手动添加\n。
fp.write("Python高薪就业,走上人生巅峰") - 刷新数据缓冲区,作用:加速数据的流动,保证缓冲区的流畅。
fp.flush()
2.4 关闭文件
- fp.close()
2.5 其他操作
- with-as:会自动关闭文件,报错了也会关闭文件
with open('test1.txt','w',encoding='utf-8') as fp: fp.write('hello') fp.flush()
三、 csv文件的操作
一种文件格式,.csv,本质是一个纯文本文件,可以作为不同程序之间数据交互的格式。
打开方式:记事本,excel
首先要导入csv模块
注意:如果不设置newline,每一行会自动有一个空行
import csv # 读取 def read_csv(path): # 1.打开文件 fp = open(path,'r',encoding='utf-8') # 2.将文件对象封装成可迭代对象 reader = csv.reader(fp) # 3.读取文件,输出列表 for row in reader: print(row) fp.close() if __name__ == '__main__': read_csv(r'F:\Python2004\day14\code\text.csv') # 写入 def write_csv(path): fp = open(path,'a',encoding='utf-8',newline='') # 将文件对象封装成可迭代对象 writer = csv.writer(fp) # csv写入 # writer.writerow(['a','b','c']) # 加单行 writer.writerows([['a', 'b', 'c'],['d','e','f']]) # 同时加多行 fp.close() if __name__ == '__main__': write_csv(r'F:\Python2004\day14\code\text.csv')