python-异常机制
在实际工作中,我们遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不符合要求;你的程序要打开某个文件,而这个文件不存在或者格式不对;你要读取数据库的数据,数据可能是空的;我们的程序一直在运行,但是内存或者磁盘闷了等等。
我们称以上遇到的问题为异常:Exception。即为例外,异常,我们要做的就是让程序面对以上问题做出合理的处理,不至于程序崩溃。
异常机制本质
所谓异常处理,就是指程序出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行。
如何解决异常,要首先冷静分析:
1、不慌张,细看信息,定位错误。看清楚报的错误信息,并定位发生错误的地方
2、百度并查看相关的10个帖子。将异常类信息进行被堵,至少查看十个以上的相关帖子
3、以上无法解决,找老师和同学协助
Python中一切都是对象,异常也采用对象的方式来处理。处理过程:
1、抛出异常:在执行一个方法时。如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器
2、捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常
#traceback追溯,追根溯源,most recent call last 最后一次调用
def a():
num = 1/0
def b():
a()
def c():
b()
c()
#Traceback (most recent call last):
#File “C:/Users/Administrator/Desktop/数据结构python/pythonProject/异常/异常1.py”, line 8, in
#c()
#File “C:/Users/Administrator/Desktop/数据结构python/pythonProject/异常/异常1.py”, line 7, in c
#b()
#File “C:/Users/Administrator/Desktop/数据结构python/pythonProject/异常/异常1.py”, line 5, in b
#a()
#File “C:/Users/Administrator/Desktop/数据结构python/pythonProject/异常/异常1.py”, line 3, in a
#num = 1/0
#ZeroDivisionError: division by zero
try……一个except结构
是最常见的异常处理结构。结构如下:
Try:
被监控的可能一发异常的语句块:
Except baseException [as e]:
异常处理语句块
Try块包含着可能引发异常的代码,except块则用来捕捉和处理发生的异常。执行的时候,如果try块中没有引发异常,则跳过except块继续执行后续代码;执行的时候,如果try块中发生了异常,则跳过try块中的后续代码,跳到相应的except中处理异常;异常处理完后,继续执行代码
#测试简单的0不能做除数异常
try:
print(“1”)
a=3/0
print(“2”)
except BaseException as e:
print(“3”)
print(e)
print(4)
#1
#3
#division by zero
#4
Try……多个except结构
上面的结构可以捕获所有的异常,工作中也很常见。但是,从经典理论开了,一般建议尽量捕获可能出现的多个异常。按照先子类后父类的顺序,并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加baseexception。结构如下:
Try:
被监控的、可能引发异常的语句块
Except exception1:
处理exception1的语句块
Except exception2:
处理exception2的语句块
。。。
Except baseexception
处理可能遗漏的异常的语句块
python-IO
-*一个完整的程序一般包括数据的存储和读取,我们在前面写的程序数据都没有进行实际的存储,因此python解释器执行玩数据就消失了。实际开发中,我们经常需要从外部存储介质读取数据,或者将程序产生的数据存储到文件中,实现“持久化”保存。
有基础的同学都知道,很多软件系统是将数据存储的到数据库中,数据库实际也是基于文件形式存储的,本章我们就学习文件的相关操作
文本文件和二进制文件
按文件中数据组织形式,我们把文件分为文本文件和二进制文件两大类
1、文本文件
文本文件存储的是普通“字符”文本,默认为Unicode字符集,可以使用几十遍程序打开。但是,像word软件编辑的文档不是文本文件
2、二进制文件
二进制文件把数据内容用字节进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4视频文件,MP3音频文件,jpg图片,doc文档等等。
文件操作相关模块概述
名称 说明
Io模块 文件流的输入和输出
Os模块 基本操作系统功能,包括文件操作
Glob模块 查找符号特点规则的文件路径名
Fnmatch模块 使用模式来匹配文件路径名
Fileinput模块 处理多个输入文件
Filecmp模块 用于文件的比较
Cvs模块 用于csv文件处理
Pickle和cpickle 用于序列化和反序列化
Xml包 用于xml数据处理
Bz2、gzip、zipfile、zlib、tarfile 用于处理压缩和解压缩文件
创建文件对象open()
Open函数用于创建文件对象,基本语法格式如下:
Open(文件名,打开方式)
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如:D:a\b.txt。为了减少“\”的输入,可以使用原始字符串:r:”d:\b.txt”。示例如下:
f = open(r”:\b.txt”,”a”)
打开方式有如下几种:
模式 藐视
r 读模式
w 写模式
a 追加模式
b 二进制模式
- 读、写模式
文本文件对象和二进制文件对象的创建:
如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是字符,如果是二进制模式b,则创建的是二进制文件对象,处理的基本单元是字节。
文本文件的写入
基本的文件写入操作
文本文件的写入一般就是三个操作:
1、创建文件对象
2、写入数据
3、关闭文件对象
f=open(“a.txt”,“a”)
s=“xxx”
f.write(s)
f.write(“aaa”)
f.close()
在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问题。为了让大家有能力解决中文乱码问题,这里简单介绍一下各种编码之间的关系。
常用编码直接的关系如如下。
Close关闭文件流
由于文件底层是由操作系统控制,所以我们打开的文件对象必须显示调用close方法关闭文件对象。当调用close方法时,首先会把缓冲区数据写入文件,再关闭文件,释放文件对象
为了确保打开的文件对象正常关闭,一般结合异常机制的finally或者with关键字实现无论何种情况都能关闭打开的文件对象
try:
f = open(r"a.txt",“a”)
str = “zzh”
f.write(str)
except BaseException as e:
print(e)
finally:
f.close()
With上下文管理
With关键字可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场
s = [“aa\n”,“bb\n”,“cc”]
with open(“b.txt”,“w”) as f:
f.writelines(s)
文本文件的读取
文件的读取一般使用如下三个方法:
1、read(size)
从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件
2、Readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串
3、Readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表
二进制文件的读取和写入
二进制文件的处理流程和文本文件流程一直。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。例如:
F=open(r”d:\a.txt”,’wb’) #可写的、重写模式的二进制文件对象
F=open(r”d:\a.txt”,’ab’)#可写的、追加模式的二进制文件对象
F=open(r”d:\a.txt”,’rb’)#可读的二进制文件对象
创建好二进制文件对象后,仍然可以使用write()、read()实现文件的读写操作
读取图片文件,实现文件的拷贝
使用pickle序列化
Python中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将内存块的数据保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要对象的序列化和反序列化。对象的序列化机制广泛的应用在分布式、并行系统上。
序列化指的是:将对象转化成串行化数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
我们可以使用pickle模块中的函数,实现序列化和反序列操作
序列化我们使用:
Pickle.dumo(obj,file) obj就是要被序列化的对象,file指的是存储的文件
Pickle.load(file) 从file读取数据,反序列化成对象
#序列化
import pickle
with open(“a.dat”,“wb”) as f:
a1=“高琪”
a2=234
a3=[1,2,3]
pickle.dump(a1,f)
pickle.dump(a2,f)
pickle.dump(a3,f)
#反序列化
import pickle
with open(“a.dat”,“rb”) as f:
a1 = pickle.load(f)
a2 = pickle.load(f)
a3 = pickle.load(f)
print(a1,a2,a3)
Csv文件的操作
Csv是逗号分隔符文本格式,常用于数据交换、Excel文件和数据的导入和导出。与Excel文件不同,csv文件中:
值没有类型,所有值都是字符串
不能指定字体颜色等样式
不能指定单元格的宽高,不能合并单元格
没有多个工作表
不能嵌入图像图表
Python标准库的模块csv提供了读取和写入csv格式文件的对象
我们在Excel中建立一个简单的表格:
另存为csv,我们打开查看这个csv文件内容:
姓名,年龄,工作,薪水
高琪,18,程序员,50000
高老三,19,测试工程师,20000
高老五,20,人工智能开发,50000
Csv Reader对象和csv文件读取
import csv
with open(“C:\Users\Administrator\Desktop\aa.csv”,“r”) as f:
print(f.readlines())
f.seek(0)
# print(list(acsv))
# f.seek(0)
# for row in acsv:
# print(row)
with open(“a.csv”, “w”) as t:
wcsv = csv.writer(t)
wcsv.writerow(f.readlines())
Walk()递归遍历所有文件和目录
Os.walk()方法:
返回一个3个元素的元组,(dirpath,dirnames,Filenames)
Dirpath 要列出指定目录的路径
Dirnames 目录下的所有文件夹
Filenames 目录下的所有文件