第十二章 异常处理
程序将停止,并显示一个traceback。
12.1 常见异常
AssertionError | 断言语句(assert)失败 |
AttributeError | 尝试访问未知的对象属性 |
EOFError | 用户输入文件末尾标志EOF(Ctrl+d) |
FloatingPointError | 浮点计算错误 |
GeneratorExit | generator.close()方法被调用的时候 |
ImportError | 导入模块失败的时候 |
IndexError | 索引超出序列的范围 |
KeyError | 字典中查找一个不存在的关键字 |
KeyboardInterrupt | 用户输入中断键(Ctrl+c) |
MemoryError | 内存溢出(可通过删除对象释放内存) |
NameError | 尝试访问一个不存在的变量 |
NotImplementedError | 尚未实现的方法 |
OSError | 操作系统产生的异常(例如打开一个不存在的文件) |
OverflowError | 数值运算超出最大限制 |
ReferenceError | 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象 |
RuntimeError | 一般的运行时错误 |
StopIteration | 迭代器没有更多的值 |
SyntaxError | Python的语法错误 |
IndentationError | 缩进错误 |
TabError | Tab和空格混合使用 |
SystemError | Python编译器系统错误 |
SystemExit | Python编译器进程被关闭 |
TypeError | 不同类型间的无效操作 |
UnboundLocalError | 访问一个未初始化的本地变量(NameError的子类) |
UnicodeError | Unicode相关的错误(ValueError的子类) |
UnicodeEncodeError | Unicode编码时的错误(UnicodeError的子类) |
UnicodeDecodeError | Unicode解码时的错误(UnicodeError的子类) |
UnicodeTranslateError | Unicode转换时的错误(UnicodeError的子类) |
ValueError | 传入无效的参数 |
ZeroDivisionError | 除数为零 |
TypeError:类型错误
不同类型间的操作出现的错误
1 + '1'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
例2
age = input('请输入你的年龄') if age >= 18: print('成年人...')
SyntaxError:语法错误
print'zdb'
SyntaxError: invalid syntax
IndexError: 索引错误
索引超出序列的范围
my_list = [1, 2, 3] # 这里是0到2的索引 my_list[3]
IndexError: list index out of range
NameError :尝试访问一个不存在的变量
fishc
NameError: name 'fishc' is not defined
AssertionError :断言语句(assert)失败
my_list = ['zdb'] assert len(my_list) > 0 my_list.pop() #列表只有一个元素,删除了就为0 assert len(my_list) > 0
Traceback (most recent call last): File "C:/Users/zdb/PycharmProjects/untitled/temp.py", line 4, in <module> assert len(my_list) > 0 AssertionError
AttributeError :尝试访问未知的对象属性
my_list = ['zdb'] assert len(my_list) > 0 my_list.fishc #fishc不知道是什么,访问失败
AttributeError: 'list' object has no attribute 'fishc'
KeyError 字典中查找一个不存在的关键字
my_dict = {'one':1, 'two':2, 'three':3} my_dict['one'] my_dict['four']
KeyError: 'four'
不报错解决方法: get()
my_dict = {'one':1, 'two':2, 'three':3} print(my_dict.get('four'))
None
ZeroDivisionError :除数为零
5 / 0
ZeroDivisionError: division by zero
12.2 处理异常:try-- except
例:代码出错,程序终止
f = open('我为什么是一个文件.txt') #没有这个文件 print(f.read()) #输出文件里面的内容 f.close() #关闭文件
FileNotFoundError: [Errno 2] No such file or directory: '我为什么是一个文件.txt'
为了解决上述代码终止运行的问题,这里进行异常处理
try—except
try: f = open('我为什么是一个文件.txt') print(f.read()) f.close() except OSError: # 如果上面代码出现这个异常 print('文件出错了')
文件出错了
try–except----except—except…
如果可能出现多个异常,可以使用多个except
例:
try—except ----as —
try: f = open('我为什么是一个文件.txt') print(f.read()) f.close() except OSError as reason: # 出现这个异常,执行下面语句 print('文件出错了\n错误的原因是:' + str(reason))
文件出错了 错误的原因是:[Errno 2] No such file or directory: '我为什么是一个文件.txt'
例
try: sum = 1+'1' except TypeError as reason: print('类型出错了\n错误的原因是:' + str(reason))
类型出错了 错误的原因是:unsupported operand type(s) for +: 'int' and 'str'
try----except----else—
try: int('123') except ValueError as reason: print('出错了!' + str(raeson)) # 出现valueerror异常输出这个 else: print('没有任何异常!') #没有异常输出这句
没有任何异常!
try----except----else----finally
finally后面的语句是无论try里面的代码出不出错都会执行的
try: f = open('data.txt', 'w') #写入的方式打开 for each_line in f: print(each_line) #输出内容 except OSError as reason: print('出错了:' + str(reason)) finally: #finally定会执行 f.close()
出错了:not readable
例2
try: with open('data.txt', 'w') as f: #相当于f=open() for each_line in f: print(each_line) except OSError as reason: #打开一个不存在的文件 print('出错了:' + str(reason)) finally: f.close()
出错了:not readable
12.3 创建异常类型:raise语句
raise ZeroDivisionError('除数为零的异常')
raise ZeroDivisionError('除数为零的异常') ZeroDivisionError: 除数为零的异常
例
def triangle(a, b, c): if (a+b<=c)|(a+c<=b)|(b+c<=a): raise Exception('不满足两边之和大于第三边!') else: print('是三角形!') try: triangle(1,2,3) except Exception as error: print('错误:' + str(error))
错误:不满足两边之和大于第三边!
12.4 断言:assert
- 断言是一个完整性的检查,确保代码没有做什么明显错误的事情。这些完整的检查由assert语句执行。如果检查失败,就会抛出异常。
assert语句包含以下部分:
- assert关键字
- 条件(即求值为True或False的表达式)
- 逗号
- 当条件为False时显示的字符串
assert 3<4, '正确' assert 3>4, '错误'
12.5 存储数据:json.dump()和json.load()
- 模块json让你能够将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。还可以在python程序之间分享数据,在其它语言之间也能分享。
1、函数json.dump()接受两个参数:要存储的数据、存储数据的文件对象。
import json numbers = [2, 3, 5, 7, 11, 13] filename = 'numbers.json' with open(filename, 'w') as f_obj: #写入的方式打开,用f_obj表示 json.dump(numbers,f_obj) #两个参数,存储的数据,文件对象
2、使用json.load()将这个列表读取到内存中
import json filename = 'numbers.json' with open(filename) as f_obj: #写入的方式打开,用f_obj表示 numbers = json.load(f_obj) print(numbers)
第十三章 os模块和os.path模块
13.1 os模块介绍
OS:Operating System 操作系统
- 1、os模块是python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
- 2、os模块与os.path模块用于对目录或文件进行操作
例:打开记事本
执行代码就自动打开
# 打开记事本 import os os.system('notepad.exe')
和Win+R再输入notepad再回车,结果一样
例:打开计算器
# 打开计算器 import os os.system('calc.exe')
例:启动QQ
# 直接调用可执行文件 # 启动QQ import os os.startfile('D:\\Program Files\\Tencent\\QQ\\Bin\\qq.exe')
13.2 os模块操作目录相关函数
函数名 | 使用方法 |
getcwd() | 返回当前工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建单层目录,如该目录已存在抛出异常 |
makedirs(path) | 递归创建多层目录,如该目录已存在抛出异常,注意:'E:\a\b’和’E:\a\c’并不会冲突 |
rmdir(path) | 删除单层目录,如该目录非空则抛出异常 |
removedirs(path1/path2…) | 递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常 |
chdir(path) | 将path设置为当前工作目录 |
remove(path) | 删除文件 |
rename(old, new) | 将文件old重命名为new |
system(command) | 运行系统的shell命令 |
walk(top) | 遍历top路径以下所有的子目录,返回一个三元组:(路径, [包含目录], [包含文件]) |
以下是支持路径操作中常用到的一些定义,支持所有平台 | |
os.curdir | 指代当前目录(‘.’) |
os.pardir | 指代上一级目录(‘…’) |
os.sep | 输出操作系统特定的路径分隔符(Win下为’\‘,Linux下为’/') |
os.linesep | 当前平台使用的行终止符(Win下为’\r\n’,Linux下为’\n’ |
os.name | 指代当前使用的操作系统(包括:‘posix’, ‘nt’, ‘mac’, ‘os2’, ‘ce’, ‘java’) |
os.getcwd():获取当前工作目录
import os print(os.getcwd())
C:\Users\zdb\PycharmProjects\untitled
os.chdir() :设置设置当前工作目录
os.listdir(): 列举指定目录中的文件名
(’.‘表示当前目录,’…'表示上一级目录)
import os print(os.getcwd()) #获取当前工作目录 os.chdir('E:\\') #改变工作目录 print(os.getcwd()) print(os.listdir('E:\\')) #把目录中的所有文件列举出来
C:\Users\zdb\PycharmProjects\untitled E:\ ['$RECYCLE.BIN', 'abc.txt', 'BaiduNetdiskDownload', 'DTLFolder', 'QLDownload', 'qqpcmgr_docpro', 'qycache', 'shuzizhong', 'System Volume Information', 'text.txt', 'WanyxGames', 'work', 'Youku Files', '江西理工大学-Ver6.0.0(20170419)Windows(通用版).exe']
mkdir(path) :创建单层目录,如该目录已存在抛出异常
os.mkdir('E:\\A') #E潘中创建文件夹A os.mkdir('E:\\A\\B') #A里面建立B
makedirs(path):创建多级目录
### makedirs(path) 创建多级目录
remove(path) :删除文件
os.remove('E:\\A\\B\\text.txt') #删除text.txt
rmdir(path):删除单层目录,如该目录非空则抛出异常
os.rmdir('E:\\A\\B') #删除B
rmmovedirs(path):删除多级目录
import os os.removedirs('A/B/C')
os.curdir 指代当前目录(’.’)
import os print(os.curdir) #显示当前目录 print(os.listdir(os.curdir)) #显示上一级目录
. ['.idea', 'A_1.txt', 'A_2.txt', 'A_3.txt', 'B_1.txt', 'B_2.txt', 'B_3.txt', 'temp.py', 'venv']
13.3 os.path模块操作目录相关函数
函数名 | 使用方法 |
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 判断指定路径(目录或文件)是否存在,存在返回True |
join(path, name) | 将目录与目录或者文件名拼接起来 |
splitext(path) | 分离文件名与扩展名,返回(f_name, f_extension)元组 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 同于判断是否为路径 |
split(path) | 分割文件名与路径,返回(f_path, f_name)元组。如果完全使用目录,它也会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在 |
getsize(file) | 返回指定文件的尺寸,单位是字节 |
getatime(file) | 返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算) |
getctime(file) | 返回指定文件的创建时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算) |
getmtime(file) | 返回指定文件最新的修改时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算) |
以下为函数返回 True 或 False |
isabs(path) | 判断指定路径是否为绝对路径 |
isfile(path) | 判断指定路径是否存在且是一个文件 |
islink(path) | 判断指定路径是否存在且是一个符号链接 |
ismount(path) | 判断指定路径是否存在且是一个挂载点 |
samefile(path1, paht2) | 判断path1和path2两个路径是否指向同一个文件 |
os.path.relpath(patj, start):返回从start到path的相对路径的字符串
os.path.abspath():返回文件的绝对路径
import os.path print(os.path.abspath('temp.py'))
C:\Users\zdb\PycharmProjects\untitled\temp.py
os.path.exists(path):判断文件是否存在
# 判断文件是否存在,存在为True import os.path print(os.path.exists('temp.py'), os.path.exists('111.py'))
True False
os.path.join() :合成路径
import os.path print(os.path.join('E:\\Python', 'temp.py'))
E:\Python\temp.py
例2
import os print(os.path.join('A','B','C')) #合成工作路径名 print(os.path.join('C:','A','B','C')) print(os.path.join('C:\\','A','B','C'))
A\B\C C:A\B\C C:\A\B\C
basename(path) :去掉目录路径,单独返回文件名
import os print(os.path.basename('E:\\A\\B\\C\\abc.avi')) #只显示文件名
abc.avi
dirname(path) :去掉文件名,单独返回目录路径
import os print(os.path.dirname('E:\\A\\B\\C\\abc.avi')) #只显示工作路径
E:\A\B\C
os.path.split(path) :分割文件名与路径,返回(f_path, f_name)元组。如果完全使用目录,它也会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在
import os print(os.path.split('E\\A\\abc.avi')) #分割文件名与路径 print(os.path.split('E\\A\\B')) #将最后一个目录作为文件名分割下来
('E\\A', 'abc.avi') ('E\\A', 'B')
splitext(path) :分离文件名与扩展名,返回(f_name, f_extension)元组
import os print(os.path.splitext('E\\A\\abc.avi')) #分离文件名与文件后缀
('E\\A\\abc', '.avi')
ismount(path) :判断指定路径是否存在且是一个挂载点
import os print(os.path.ismount('E:\\')) print(os.path.ismount('E:\\A'))
True False
课堂案例
例:获取当前目录里的所有.py文件
import os path = os.getcwd() # 获取当前工作目录 lst = os.listdir(path) # 列举当前目录的所有文件,放在列表中 for filename in lst: # 遍历列表中的所有文件 if filename.endswith('.py'): # 如果是.py文件 print(filename) # 就输出
alien_invasion.py all_events.py ball.py car.py electric_car.py game_functions.py glass.py main.py name_function.py pizza.py settings.py survey.py temp.py
13.4 os.path.getatime() 、os.path.getctime()、os.path.getmtime()
os.path.getatime(file) :访问时间
- 返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
oa.path.getctime(file):创建时间
- 返回指定文件的创建时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
oa.path.getmtime(file) :修改时间
- 返回指定文件最新的修改时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
import os print(os.path.getatime('E:\\abc.txt')) #返回访问时间 print(os.path.getctime('E:\\abc.txt')) #返回创建时间 print(os.path.getmtime('E:\\abc.txt')) #返回修改时间
1591704113.4222739 1591704113.4222739 1591704113.4222739
用time模块的gmtime()或localtime()函数换算
import time import os print(time.gmtime(os.path.getatime('E:\\abc.txt'))) print(time.localtime(os.path.getmtime('E:\\abc.txt')))
time.struct_time(tm_year=2020, tm_mon=6, tm_mday=9, tm_hour=12, tm_min=19, tm_sec=41, tm_wday=1, tm_yday=161, tm_isdst=0) time.struct_time(tm_year=2020, tm_mon=6, tm_mday=9, tm_hour=20, tm_min=19, tm_sec=41, tm_wday=1, tm_yday=161, tm_isdst=0)