python os.path.relpath(path,start)使用说明(有坑) 作者:马育民 • 2024-05-27 22:09 • 阅读:10040 # 说明 从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 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 原文出处:http://malaoshi.top/show_1IX7lgB5Qr3C.html