说明
从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