异常简介
产考文档:https://docs.python.org/3/library/exceptions.html
产考文档-传送门
- 程序在运行过程当中,不可避免的会出现一些错误,比如:
- 使用了没有赋值过的变量
- 使用了不存在的索引
- … 这些错误在程序中,我们称其为异常。
- 程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行!
处理异常
- Python是希望在出现异常时,我们可以编写代码来对异常进行处理!不是让我们的程序直接终止!
try:
代码块(可能出现错误的语句)
except: # except子句可以写多个或一个
代码块(出现错误以后的处理方式)
except:
代码块(出现错误以后的处理方式)
except:
代码块(出现错误以后的处理方式)
else:
代码块(没出错时要执行的语句)
finally:
代码块(该代码都会执行)
#try是必须要有的,else是可以没有的(finally)
#except和finally 至少有一个
'''
可以将可能出错的代码放入到ty语句,这样如果代码没有错误,则会正常执行如果出现错误,则会执行except子句中的代码,这样我们就可以通过代码来处理异常。避免因为一个异常导致整个程序的终止
'''
异常传播(抛出异常)
-
当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播
-
如果函数中没有对异常进行处理,则异常会继续向函数调用处传播,函数调用处没有处理则继续向被调用的地方传播。
-
直到传播到全局作用域 (主模块),依然没有处理则程序终止,并且显示异常信息
-
当程序运行过程中出现异常以后,所有的异常信息会被保存一个专门的异常对象中。而异常传播时,实际上就是异常对象抛给了调用处
-
比如:
-
ZeroDivisionError类的对象专门用来表示除0的异常
-
常见的异常
-
IndexError
索引值超过了列表长度
>>> l = [1] >>> l[2] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range
-
KeyError
找不到Key
>>> d = {"a": 1} >>> d["b"] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'b'
-
ValueError
传入的参数错误
>>> int('a1') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'a1'
-
TypeError
类型错误, 常见于运算
>>> 1 + '2' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str'
-
SyntaxError
语法报错, 检查自己的语法有没有写错
-
IndentationError
缩进错误
- 混用tab和space(空格)
- 缩进长度不对
-
-
自定义异常
#创建一个继承Exception的类,就可以自定义异常
class MyError(Exception):
pass
def add(a,b):
#如果a,b中有负数,就向调用出抛出异常
if a < 0 or b < 0 :
raise Exception('参数中不能有负数')
raise MemoryError('自定义的异常')
#也可以用if else 代替
print(add(-1,15))
文件(File)
参考文档:https://docs.python.org/3/library/functions.html
产考文档-传送门
-
通过Python程序来对计算机中的各种文件进行增删改查的操作
-
I/O(Input Output)
-
操作文件的步骤
-
打开文件
-
对文件进行各种操作(读,写),然后保存
-
关闭文件
-
open
-
写:open()+write()
#在windows系统使用路径时,可以使用/来代替\ #或者可以使用\\来代替、 #或者也可以使用原始字符串 #file_name = 'E:/20220708_file_python/demo01.txt' file_name = r'E:\20220708_file_python\demo02w.txt' #使用open() 打开文件时必须要指定打开文件所要做的操作(读、写、追加) #如果不指定操作类型,则默认是 (r)读取文件,而读取文件时是不能向文件中写入的 #r 表示只读的 #w 表示是可写的,使用来写入文件时,如果文件不存在会创建文件,如果文件存在则会覆盖文件 #a表示追加内容,如果文件不存在会创建文件,如果文件存在则会向文件中追加内容 #+ 为操作符增加功能 #a+即可读又可写,文件不存在会报错 #with open(file_name, 'w', encoding='utf-8') as file_obj: with open(file_name, 'r+', encoding='utf-8') as file_obj: #write() 来向文件中写入内容 #如果操作的是一个文本文件的话,则write() 需要传递一个字符串作为参数 #该方法会可以分多次向文件中写入内容 #写入完成以后,该方法会返回写入的字符的个数 file_obj.write('1.二哈哒哒哒哒哒\n') file_obj.write(str(2.1234564050)+'11111\n') file_obj.write('3..dudududududu\n')
-
读:read()
''' open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)¶ 使用open函数来打开一个文件 参数: fi1e要打开的文件的名字(路径) 返回值: 返回一个对象,这个对象就代表了当前打开的文件 ''' file_name = r'E:\20220708_file_python\demo01.txt' #原始字符串 ''' print(file_obj) #调用open()打开文件 file_obj = open(file_name) #当我们获取到文件对象以后,所有的对文件的操作都应该通过 对对象来进行 #读取文件内容 #read()方法,用来读取文件中的内容,它会将内容全部保存为一个字符串返回 content = file_obj.read() print(content) #关闭文件 #调用close() 方法来关闭文件 #file_obj.close() ''' # with ... as 语句 try: with open(file_name) as file_obj: #在with语句中可以直接使用file_obj来做文件操作 #此时这个文件只能在with中使用,一旦with结束则文会自动close() print(file_obj.read()) except FileNotFoundError: print(f'{file_name}文件不存在')
-
try + with open() + while
file_name = r'E:\20220708_file_python\demo01.txt'
try:
with open(file_name, encoding='utf-8') as file_obj:
#定义一个变量,来保存文件内容
file_txt = ''
#定义一个变量,指定每次读取文件的大小
key = 5
#创建一个循环,来读取文件内容
while True:
#读取 `key` 大小的内容
txt = file_obj.read(key)
# 检查是否 读取到内容
if not txt:
#内容读取完毕,就退出循环
break
#输出内容 1
#print(txt,end='')
#输出内容 2
file_txt += txt
except FileNotFoundError as e:
print(e)
print(file_txt)
- readline()+readlines()
import pprint
file_name = r'E:\20220708_file_python\demo01.txt'
with open(file_name, encoding='utf-8') as file_obj:
#readline()
#该方法可以用来读取一行内容
#print(file_obj.readline(),end='')
#print(file_obj.readline())
#print(file_obj.readline())
#readlines()
#该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表中返回
#r=file_obj.readlines()
#pprint.pprint(r[0])
#pprint.pprint(r[1])
for i in file_obj:
print(i)
- 二进制文件
#t读取文本文件(默认值)
#b读取二进制文件
file_name = r'F:\.md-demo\11111.png'
with open(file_name, 'rb') as file_obj:
#读取文本文件时,size是以字符为单位的
#读取二进制文件时,size是以字节为单位
#
# print(file_obj.read(100))
#new_name 定义一个新的文件
new_name = r'E:\ile_python\new02.png'
with open(new_name, 'wb') as new_obj:
#定义每次读取的大小
chunk = 1024 *100
while True:
#从已有的对象中读取数据
content = file_obj.read(chunk)
#内容读取完毕终止 `while` 循环
if not content:
break
new_obj.write(content)
- seek() + tell()
file_name = r'E:\demo02w.txt'
'''
with open(file_name, 'rb') as file_obj:
#seek() 可以修改当前读取位置
file_obj.seek(10)
file_obj.seek(12 , 1)
#print(file_obj.read(122))
#seek(a,b) 需要两个参数
#a代表:要切换到的位置
#b代表:计算位置方式
#可选值:
#0,从头计算,默认值
#1,从当前位置计算
#2,从最后位置开始计算
#tell() 可以查看当前读取位置
print('当前读取到了-->', file_obj.tell())
'''
with open(file_name, 'r', encoding='utf-8') as file_obj:
#seek() 可以修改当前读取位置
file_obj.seek(6)
print(file_obj.read()) #跳过前6个字节
#tell() 可以查看当前读取位置
print('当前读取到了-->', file_obj.tell())
- Os
import os
import pprint
#
# Os产考文档:https://docs.python.org/3/py-modindex.html#cap-o
#os.listdir() 获取指定目录的目录结构
#需要一个路径作为参数,会获取到该路径下的目录结构,默认路径为,当前目录
#该方法会返回一个列表,目录中的每一个文件(夹)的名字都是列表中的一个元素
#r = os.listdir('..')
#getcwd() 获取当前目录
r = os.getcwd()
pprint.pprint(r)
#os.chdir() 换当前所在的目录作用相当于cd
#os.chdir('c:/')
#创建目录
#os.mkdir("aaa") #在当前目录下创建一个名字为aaa的目录
#创建文件 #open('aa.txt','w')
open(r'E:\\11.txt','w')
#删除目录 #os.rmdir('aaa')
#删除文件 #os.remove('aa.txt')
#修改文件
#os.rename('旧名字','新名字')
#os.rename('aa.txt','bb.txt')