在Python 3中,我使用pathlib
定义了两条路径,例如:
from pathlib import Path
origin = Path('middle-earth/gondor/minas-tirith/castle').resolve()
destination = Path('middle-earth/gondor/osgiliath/tower').resolve()
如何获取从origin
到destination
的相对路径?在此示例中,我想要一个返回../../osgiliath/tower
或等效值的函数。
理想情况下,我会有一个始终满足的功能relative_path
origin.joinpath(
relative_path(origin, destination)
).resolve() == destination.resolve()
(嗯,理想情况下会有一个运算符-
使得destination == origin / (destination - origin)
始终为真)
请注意,在这种情况下,Path.relative_to
是不够的,因为origin
不是destination
的父母。另外,我不使用符号链接,因此可以安全地假设没有任何符号链接,这样可以简化问题。
如何实施relative_path
?
答案 0 :(得分:6)
这很简单os.path.relpath
import os.path
from pathlib import Path
origin = Path('middle-earth/gondor/minas-tirith/castle').resolve()
destination = Path('middle-earth/gondor/osgiliath/tower').resolve()
assert os.path.relpath(destination, start=origin) == '..\\..\\osgiliath\\tower'
答案 1 :(得分:2)
如果您希望自己的Python函数将绝对路径转换为相对路径:
def absolute_file_path_to_relative(start_file_path, destination_file_path):
return (start_file_path.count("/") + start_file_path.count("\\") + 1) * (".." + ((start_file_path.find("/") > -1) and "/" or "\\")) + destination_file_path
这假定:
1)start_file_path
从与destination_file_path
相同的根文件夹开始。
2)斜线的类型不能互换出现。
3)您使用的文件系统中不允许使用斜杠。
根据您的用例,这些假设可能是有利还是不利。
缺点:如果使用pathlib,则通过混入此函数将破坏代码中该模块的API流;有限的用例;输入对于您正在使用的文件系统必须是无菌的。
优点:运行速度比@AdamSmith的答案快202倍(在Windows 7(32位)上进行了测试)