try...except
是最常见的异常处理结构。
try:
被监控的可能引发异常的语句块
except BaseException [as e]:
异常处理语句块
只有没有异常时,才会被执行
try:
被监控的、可能引发异常的语句块
except Exception1:
处理Exception1的语句块
except Exception2:
处理Exception2的语句块
[...]
except BaseException:
处理可能遗漏的异常的语句块
无论是否发生异常都会被执行;通常用来释放try
块中申请的资源。
try:
a = input("请输入一个被除数:")
b = input("请输入一个除数:")
c = float(a)/float(b)
except BaseException as e:
print(e)
else:
print(c)
finally:
print("我是finally中的语句,无论发生异常与否,都执行!")
# 一般用于f.close()文件的关闭
由于return
有两种作用:结束方法运行、返回值。我们一般不把return
放到异常处理结构中,而是放到方法最后。
Python中的异常都派生自BaseException
类
SyntaxError
:语法错误NameError
:尝试访问一个没有声明的变量ZeroDivisionError
:除数为0错误(零除错误)ValueError
:数值错误TypeError
:类型错误AttributeError
:访问对象的不存在的属性IndexError
:索引越界异常KeyError
:字典的关键字不存在异常名称 | 说明 |
---|---|
ArithmeticError | 所有数值计算错误的基类 |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
BaseException | 所有异常的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
EnvironmentError | 操作系统错误的基类 |
EOFError | 没有内建输入,到达EOF 标记 |
Exception | 常规错误的基类 |
FloatingPointError | 浮点计算错误 |
FutureWarning | 关于构造将来语义会有改变的警告 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
ImportError | 导入模块/对象失败 |
IndentationError | 缩进错误 |
IndexError | 序列中没有此索引(index) |
IOError | 输入/输出操作失败 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
KeyError | 映射中没有这个键 |
LookupError | 无效数据查询的基类 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
NotImplementedError | 尚未实现的方法 |
OSError | 操作系统错误 |
OverflowError | 数值运算超出最大限制 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
StandardError | 所有的内建标准异常的基类 |
StopIteration | 迭代器没有更多的值 |
SyntaxError | Python 语法错误 |
SyntaxWarning | 可疑的语法的警告 |
SystemError | 一般的解释器系统错误 |
SystemExit | 解释器请求退出 |
TabError | Tab 和空格混用 |
TypeError | 对类型无效的操作 |
UnboundLocalError | 访问未初始化的本地变量 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeError | Unicode 相关的错误 |
UnicodeTranslateError | Unicode 转换时错误 |
UserWarning | 用户代码生成的警告 |
ValueError | 传入无效的参数 |
Warning | 警告的基类 |
WindowsError | 系统调用失败 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
with
上下文管理可以自动管理资源,在with
代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出with
块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用。
with open("d:/bb.txt") as f:
for line in f:
print(line)
使用traceback
模块打印异常信息
异常信息会拼接到a.log文件中
import traceback
try:
print("step1")
num = 1/0
except:
with open("d:/a.log","a") as f:
traceback.print_exc(file=f)
class AgeError(Exception):
def __init__(self,errorInfo):
Exception.__init__(self)
self.errorInfo = errorInfo
def __str__(self):
return str(self.errorInfo)+",年龄错误!应该在1-150之间"
if __name__ == "__main__":
age = int(input("请输入一个年龄:"))
if(age<1 or age>150):
raise AgeError(age)
else:
print("正常的年龄:",age)
Python标准库中,如下是文件操作相关的模块,我们会陆续给大家介绍。
名称 | 说明 |
---|---|
io模块 | 文件流的输入和输出操作 input output |
os模块 | 基本操作系统功能,包括文件操作 |
glob模块 | 查找符合特定规则的文件路径名 |
fnmatch模块 | 使用模式来匹配文件路径名 |
fileinput模块 | 处理多个输入文件 |
filecmp模块 | 用于文件的比较 |
csv模块 | 用于csv文件处理 |
pickle和cPickle | 用于序列化和反序列化 |
xml包 | 用于XML数据处理 |
bz2、gzip、zipfile、zlib、tarfile | 用于处理压缩和解压缩文件(分别对应不同的算法) |
f = open(r"d:\b.txt","w")
r——转义 w——打开方式
模式 | 描述 |
---|---|
r | 读 read模式 |
w | 写 write模式。如果文件不存在则创建;如果文件存在,则重写新内容; |
a | 追加append模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容 |
b | 二进制binary模式(可与其他模式组合使用) |
+ | 读、写模式(可与其他模式组合使用) |
文本文件对象和二进制文件对象的创建:
b
,则默认创建的是文本文件对象,处理的基本单元是“字符”。b
,则创建的是二进制文件对象,处理的基本单元是“字节”。文本文件的写入一般就是三个步骤:
#f = open(r"b.txt","w",encoding="utf-8") 中文乱码问题解决
with open(r"a.txt","a") as f:
s = "hello\nworld\n"
f.writelines() # 把字符串列表写入文件中,不添加换行符
f.write(s) # 将字符串写入文件
当调用close()
方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()
方法),再关闭文件,释放文件对象。
一般加在finally
后面
with关键字
(上下文管理器)可以自动管理上下文资源,不论什么原因跳出with块
,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
read([size])
从文件中读取size
个字符,并作为结果返回。如果没有size
参数,则读取整个文件。 读取到文件末尾,会返回空字符串(相当于移动到末尾的指针,重复调用无意义——空字符串)。
readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串
readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表
with open("b.txt","r",encoding="gbk") as f:
list1 = f.readlines() # 将每行数据读取到列表中
list2 = [line.rstrip()+"#"+str(index) for index,line in zip(range(1,len(list1)+1),list1)]
print("原文件内容:",list1)
print("添加序列号后文件内容",list2)
with open("b.txt","w",encoding="gbk") as f:
f.writelines(list2)
f = open(r"d:\a.txt", 'wb') #可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", 'ab') #可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", 'rb') #可读的二进制文件对象
with open('logo1.png','rb') as srcFile,open("ddd.png","wb") as destFile:
for line in srcFile:
destFile.write(line)
方法名 | 说明 |
---|---|
read([size]) | 从文件中读取size个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) | 将字符串str内容写入文件 |
writelines(s) | 将字符串列表s写入文本文件,不添加换行符 |
seek(offset [,whence]) | 把文件指针移动到新的位置,offset表示相对于whence的多少个字节的偏移量;offset:off为正往结束方向移动,为负往开始方向移动;whence不同的值代表不同含义:0: 从文件头开始计算(默认值)1:从当前位置开始计算2:从文件尾开始计算 |
tell() | 返回文件指针的当前位置 |
truncate([size]) | 不论指针在什么位置,只留下指针前size个字节的内容,其余全部删除;如果没有传入size,则当指针当前位置到文件末尾内容全部删除 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源 |
#文件读取
f = open("b.txt","r")
#content = f.read() #读取全部内容
#content = f.readline() #按行读取(一次读一行)
for line in f:
print(line) #读取全部内容
#文件写入
with open("b.txt","a",encoding="utf-8") as f:
f.write("这是追加内容")
f.close()
f = open("b.txt","r")
f.seek(0, 0) # 从文件头开始读取
content1 = f.readline()
print(content1)
f.seek(0, 1) # 从当前位置开始读取
content2 = f.readline()
print(content2)
print(f.tell()) # 返回当前的读取位置
f.close()
import pickle
with open("data.dat","wb") as f:
name = "Lily"
age = 18
score = [90,93,92]
resume = {'name':name,'age':age,'score':score}
pickle.dump(resume,f) # resume是被序列化的对象,f是要存储的文件
with open("data.dat","rb") as f:
resume2 = pickle.load(f) # load 读取数据,反序列化成对象
print(resume2)
csv是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。
import csv
with open(r"d:\a.csv") as a:
a_csv = csv.reader(a) #创建csv对象,它是一个包含所有数据的列表,每一行为一个元素
headers = next(a_csv) #获得列表对象,包含标题行的信息
print(headers)
for row in a_csv: #循环打印各行内容
print(row)
import csv
headers = ["工号","姓名","年龄","地址","月薪"]
rows = [("1001","张三",18,"学2","50000"),("1002","李四",19,"学10","30000")]
with open(r"d:\b.csv","w") as b:
b_csv = csv.writer(b) #创建csv对象
b_csv.writerow(headers) #写入一行(标题)
b_csv.writerows(rows) #写入多行(数据)
os模块
可以帮助我们直接对操作系统进行操作
方法名 | 描述 |
---|---|
remove(path) | 删除指定的文件 |
rename(src,dest) | 重命名文件或目录 |
stat(path) | 返回文件的所有属性(文件和文件夹) |
listdir(path) | 返回path目录下的文件和目录列表 |
os
模块下关于目录操作的相关方法,汇总如下:
方法名 | 描述 |
---|---|
mkdir(path) | 创建目录 |
makedirs(path1/path2/path3/…) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2…) | 删除多级目录 |
getcwd() | 返回当前工作目录:current work dir |
chdir(path) | 把path设为当前工作目录 |
walk() | 遍历目录树 |
sep | 当前操作系统所使用的路径分隔符 |
import os
os.system("calc.exe") #打开系统软件(计算器)
# 打印基本信息
print(os.name) #widows-->nt linux-->posix
print(os.sep) #windows-->\ linux-->/
print(repr(os.linesep)) #windows-->\r\n linux-->\n
a = '3'
print(a) #-->3
print(repr(a)) #repr可以显示数据信息
os.path
模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作
方法 | 描述 |
---|---|
isabs(path) | 判断path是否绝对路径(absolute) |
isdir(path) | 判断path是否为目录 |
isfile(path) | 判断path是否为文件 |
exists(path) | 判断指定路径的文件是否存在 |
getsize(filename) | 返回文件的大小 |
abspath(path) | 返回绝对路径 |
dirname§ | 返回目录的路径 |
getctime(filename) | 返回文件的创建时间(create) |
getatime(filename) | 返回文件的最后访问时间(active) |
getmtime(filename) | 返回文件的最后修改时间(modify) |
walk(top,func,arg) | 递归方式遍历目录 |
join(path,*paths) | 连接多个path |
split(path) | 对路径进行分割,以列表形式返回 |
splitext(path) | 从路径中分割文件的扩展名 |
# 列出当前目录下所有的.py文件
path = os.getcwd()
file_list = os.listdir(path)
print(file_list)
for file_name in file_list:
pos = file_name.rfind(".")
if file_name[pos+1:] == 'py':
print(file_name)
print("############")
file_list2 = [file_name for file_name in os.listdir(path) if file_name.endswith("py")]
print(file_list2)
os.walk()
方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
top
:是要遍历的目录。topdown
:可选,True
,先遍历top
目录再遍历子目录。
返回三元组(root
、dirs
、files
):
root
:当前正在遍历的文件夹本身
dirs
:一个列表,该文件夹中所有的目录的名字
files
:一个列表,该文件夹中所有的文件的名字
# 遍历所有的目录的名字
path = os.getcwd()
list_files = os.walk(path,topdown=False)
for root,dirs,files in list_files:
for name in files:
print(os.path.join(root,name)) # 列出当前目录下的子文件
for name in dirs:
print(os.path.join(root,name)) # 列出当前目录下的子文件夹
shutil
模块是python标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。
import shutil
#"音乐"文件夹不存在才能用
shutil.copytree("电影/学习","音乐",ignore=shutil.ignore_patterns("*.html","*.htm"))
import shutil
# 压缩一个文件
shutil.make_archive("d:/test","zip","d:/aaa")
# 压缩:将指定的多个文件压缩到一个zip文件
z = zipfile.ZipFile("a.zip","w")
z.write("a.txt")
z.write("b.txt")
z.write("c.txt")
z.close()
# 解压缩
z2 = zipfile.ZipFile("a.zip","r")
z2.extractall("d://")
z2.close()
import os
def my_print_file(path,level):
child_files = os.listdir(path)
for file in child_files:
file_path = os.path.join(path,file)
print("\t"*level+file_path[file_path.rfind(os.sep)+1:]) # 从右往前找第一个分隔符
if os.path.isdir(file_path):
my_print_file(file_path,level+1)