python os.path.relpath(path,start)使用说明(有坑)

说明

从start开始计算相对路径,此方法有多钟情况

声明:

os.path.relpath(path,start)

形参:

  • path一般是绝对路径
  • start:
    • 绝对路径
    • 可以是path的一部分(此处有坑,可能报错)

解释:从start后面第一个文件夹或者文件开始计算相对路径

情况一(推荐)

path是绝对路径
start是绝对路径,是 path 的 上级路径

提示:这种情况不会报错

import os

path = 'd:\\python\\学习\\第一课\\例子1'
start = 'd:\\python\\学习\\'

print(os.path.relpath(path, start))

执行结果:

第一课\例子1

注意

如果 start 不是 path 的上级路径,执行报错:

# path 是c盘
path = 'c:\\python\\学习\\第一课\\例子1'
# start 是d盘,不是path的上级路径,执行报错
start = 'd:\\python\\学习\\'

print(os.path.relpath(path, start))

情况二(不推荐)

  • path是绝对路径
  • start 是path的一部分

这种情况,受干扰的因素较多,容易出现bug

干扰

返回结果,与 .py 文件的路径有关

bug

下面代码在 python 3.8 环境中测试

当下面代码在 D盘 时,由于 path 路径是 C盘,执行报错

# 路径是C盘
path = 'C:\\source code\\SR\\experiments\\S'
print(os.path.relpath(path, 'experiments'))

错误如下:

Traceback (most recent call last):
  File "D:\mym\文件版本管理\test.py", line 10, in <module>
    print(os.path.relpath('D:\\source code\\SR\\experiments\\S', 'experiments'))
  File "D:\Program Files\Python38\lib\ntpath.py", line 702, in relpath
    if normcase(start_drive) != normcase(path_drive):
KeyboardInterrupt

解决

必须在同一目录才能正常运行,但运行结果也不理想

替代方法

自行实现替代方法,如下:

def relpath(path,start):
    '''
    从start开始计算相对路径(不包含start)
    替代 os.path.relpath(path[, start])
    :param path:
    :param start:
    :return:
    '''
    path = os.path.normpath(path)
    if start == "":
        return path
    # print(path)
    path = path.replace("\\","/")
    # print(path)
    new_parts = []
    parts = path.split("/")
    append_tag = False
    for item in parts:
        if item == start:
            append_tag = True
            continue
        if append_tag:
            new_parts.append(item)
    if len(new_parts) == 0:
        raise ValueError("["+path+"] 不包含 ["+start+"]")

    new_path = "/".join(new_parts)
    new_path = os.path.normpath(new_path)
    return new_path

参考:
https://blog.csdn.net/Hunter_Murphy/article/details/108043298


原文出处:/show_1IX7lgB5Qr3C.html