OS模块
路径处理
os.path.dirname() 获取文件/文件夹所在的目录路径
import os
file0516 = r'D:\0423\pycharm\0424\0516\0516.py'
res = os.path.dirname(file0516)
print(res) D:\0423\pycharm\0424\0516 # 可以理解为去掉最后一个反斜杠及之后的内容\0516.py
os.path.join() 路径拼接的方法,python可以自动识别系统
import os
path01 = r'D:\0423\pycharm\0424\0516'
file_name = '0516.py'
file_path = os.path.join(path01,file_name) # 也可使用 file_path = os.path.join(path01,'0516.py')
print(file_path) D:\0423\pycharm\0424\0516\0516.py
os.path.abspath() 获取绝对路径
import os
res3 = os.path.abspath('.') # .为当前文件夹;获取当前文件夹的绝对路径
print(res3) D:\0423\pycharm\0424\0516
res4 = os.path.abspath('..') # ..为上一级(父级)文件夹
print(res4) D:\0423\pycharm\0424
import os
cwd = os.path.abspath(__file__) # 当前文件的绝对路径
dir_name = os.path.dirname(cwd) # 当前文件的目录路径
new_file = os.path.join(dir_name,'new_abc.txt') # 路径拼接
print(new_file) # 此时还没创建新文件,是先打开要创建新文件的地址
f = open(new_file,'w') # 创建新文件
f.close()
__file__ 魔法变量获取当前文件的文件名字,由于pycharm做了优化会把前面路径补全打印成D:\0423\pycharm\0424\0516\0516.py,实际是0516.py
print(__file__) D:\0423\pycharm\0424\0516\0516.py # 由于pycharm做了识别会把前面路径补全打印成D:\0423\pycharm\0424\0516\0516.py,实际是0516.py
import os
res = os.path.abspath(__file__) # 获取当前文件的绝对路径,区别于res3 = os.path.abspath('.') ,res3为获取当前文件夹的绝对路径是当前文件的上一级
print(res) D:\0423\pycharm\0424\0516\0516.py
os.getcwd() 获取当前的工作路径
import os
res = os.getcwd()
print(res) D:\0423\pycharm\0424\py0517
os.chdir() 切换工作路径
import os
res = os.getcwd()
print(res) D:\0423\pycharm\0424\py0517
os.chdir('..') # ..为切换到上级目录
res1 = os.getcwd()
print(res1) D:\0423\pycharm\0424
import os
res = os.getcwd()
print(res) D:\0423\pycharm\0424\py0517
os.chdir('D:\\') # 切换到D盘根目录
res1 = os.getcwd()
print(res1) D:\
os.listdir() 获取当前工作路径下的文件,返回列表
import os
res = os.getcwd()
print(res) D:\0423\pycharm\0424\py0517
os.chdir('..')
res1 = os.getcwd()
print(res1) D:\0423\pycharm\0424
res3 = os.listdir('.')
print(res3) ['.idea', '04241', '0509', '0510', '0511', '0512', '0513', '0514', '0516', 'py0515', 'py0517']
os.mkdir() 在当前工作路径下创建一个文件夹
os.rmdir() 在当前工作路径下删除一个文件夹
import os
res = os.getcwd()
print(res)
# os.chdir('..')
# res1 = os.getcwd()
# print(res1)
# res3 = os.listdir('.')
# print(res3)
os.mkdir('jiuba') # 如果之前切换工作路径了,就在切换到的工作路径下创建这个文件夹
os.rmdir('jiuba') # 如果之前切换工作路径了,就在切换到的工作路径下删除这个文件夹
os.path.isfile() 判断是否是文件,返回的是布尔值
os.path.isdir() 判断是否是文件夹,返回的是布尔值
res4 = os.path.isfile(r'D:\0423\pycharm\0424\py0517\py0517.py')
print(res4) True
res5 = os.path.isdir(r'D:\0423\pycharm\0424\py0517')
print(res5) True
异常捕获
try: # 除了语法错误所有的常规错误类型都可以通过try捕获,通过异常捕获可以提高代码的容错性
代码块 # 1、涉及用户输入 2、涉及到文件操作 3、涉及到网络请求 等这些不确定因素有可能会报错的代码块放到try里
except: # 当try里面的代码出错了,就会执行except里面的代码,可在此处处理异常;当try正常执行后则不会执行except里的代码
代码块
else: # 当try里面的代码没有出现异常,会执行该代码块
代码块
finally: # 不管try里面的代码是否出现异常,始终都会执行该代码块,语法错误除外
代码块
其中try和except是必须成对出现,否则报语法错误;else和finally根据实际情况决定是否需要;可以嵌套try...excepe;可以try...except...except ;try...except...else...finally ;try...except...else ;try...except...finally
print('------1------')
print('------2------')
try:
a = int(input('请输入数字:'))
except:
print('输入的不是数字')
print('------3------')
print('------4------')
print('------5------')
如果try里可能包含有多个类型的错误,不同的异常类型做不同的处理
print('------1------')
print('------2------')
try:
a = int(input('请输入数字:')) # 如果这行代码捕获异常了则try里之后的代码块不会运行,直接跳到对应匹配错误的except里面;如果没有对应的匹配错误的except则会直接报错,代码中断不会再继续执行
with open('py0517.py','r') as f: # 编码错误报的是ValueError,因为给的值不是它需要的值不是它需要的类型数据,需要在后面加 ,encoding='utf-8'
f.read()
print(name) # name没有定义不属于语法错误
except ValueError as e: # 如果有跳到该行执行下面的代码块,可以在后面使用as 别名 接收错误信息并打印出来查看,也可以不使用
print('输入的不是数字')
print(e)
except FileNotFoundError:
print('文件未找到')
print('------3------')
print('------4------')
print('------5------')
所有的异常类型,做相同的处理
print('------1------')
print('------2------')
try:
a = int(input('请输入数字:'))
with open('py0517.py','r') as f:
f.read()
print(name) # name没有定义不属于语法错误
except Exception as e: # 语法错误除外所有的错误类型都可以使用Exception捕获;except Exception区别于except,except Exception可以在后面加as 别名来接收异常提示,提取异常信息,而except则不可以
print('输入的不是数字')
print(e)
print('------3------')
print('------4------')
print('------5------')
print('------1------')
print('------2------')
try:
a = int(input('请输入数字:'))
b = 10/0 # 0不能作除数
except (ValueError,KeyError,ZeroDivisionError) as e: # 如果在except里捕获指定的多个异常,可以使用元组的形式
print(e)
else:
print('else,try不出错才会执行') # 如果try里面的代码没有异常,运行该代码块
finally:
print('finally,无论如何都会执行') # 无论如何都会执行该代码块(语法错误除外),即使出现的错误异常没有被捕获也会运行完该代码块后再报错,之后的代码中断运行
print('------3------') # 出现报错后代码就中断运行,这行及之后的代码中断运行
print('------4------')
print('------5------')
raise 手工制造一个异常,让程序终止运行并抛出异常
try:
a = input("输入一个数:")
# 判断用户输入的是否为数字
if(not a.isdigit()):
raise ValueError("a 必须是数字") # raise 错误类型,写什么错误类型就报什么错误,只要下面没有同类型的捕获(描述信息,可不写)
except TypeError as e:
print("引发异常:",repr(e))
raise
try:
a = int(input("输入一个数:"))
# 判断用户输入的是否为数字
if(not a.isdigit()): # 如果输入的不是数字,也不会进入if判断语句,因为在try代码块中有对应的ValueError捕获;
raise ValueError("a 必须是数字") # 在此处使用raise后面需要带参数,而且后面的错误类型不能和捕获的指定类型一样,否则不会运行该代码块,因为会直接被捕获
pass
except ValueError as e:
print("引发异常:",repr(e))
raise # 在此处使用raise后面不带任何参数,捕获到异常后执行特定操作并抛出异常,程序终止运行
断言 关键字 assert
print('---1---')
assert 100 == 99 # 断言错误后会报AssertionError,且代码终止运行
print('---2---')
res = '五百万'
exc = '五百万1'
try:
assert res == exc
except AssertionError as a:
print('断言错误')
print(repr(a))
# raise # 可使用raise再抛出异常
else:
print('断言成功')
unittest中内置的断言方法
# 断言是否相等, self.assertEqual(预期结果,实际结果)
self.assertEqual(expected, actual)
# 断言某种表达是否为 True
self.assertTrue( expected == actual )
self.assertIn(expected, actual)
self.assertTrue( expected in actual )
常见的异常类型
try:
a = [1, 2]
a[8]
except IndexError as err: # 索引错误
print(err)
dic = {'daxigua': 'yikuai', 'banana': 'bamao', 'apple': 'erdianwu'}
try:
print(dic['orange'])
except KeyError as err1: # 键错误
print(err1)
try:
2 / 0
except ZeroDivisionError as err2: # 除数为0错误
print(err2)
try:
dic.update(1)
except TypeError as err3: # 类型错误
print(err3)
try:
s
except NameError as err4: # 名字错误,未被定义
print(err4)
try:
with open('py00001') as f1:
f1.read()
except FileNotFoundError as err5: # 文件未找到错误
print(err5)
try:
with open('chinese.txt') as f1:
f1.read()
except UnicodeDecodeError as err6: # 编码错误
print(err6)
try:
int('daxigua')
except ValueError as err7: # 值错误
print(err7)
try:
import daxigua
except ImportError as err8: # 导包错误,不存在的包
print(err8)
try:
for i in range(1):
print(i)
1
except IndentationError as err9: # 缩进错误
print(err9)
class Car():
atter1 = '飙车'
try:
Car.atter2
except AttributeError as err10: # 对象没有这个属性错误
print(err10)
try:
assert 100 == 99
except AssertionError as a:
print('断言错误')
print(repr(a))
raise # 可使用raise再抛出异常
else:
print('断言成功')
断言错误
AssertionError()
AssertionError # 断言错误
SyntaxError # python语法错误