OS路径处理与异常捕获try,except,raise,assert

本文详细介绍了Python中的OS模块,包括路径处理方法如dirname、abspath、join等的使用,以及如何进行路径切换、文件和文件夹的操作。同时,还探讨了异常处理机制,包括try-except结构的使用和常见异常类型的捕获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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语法错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值