如何使用pathlib在Python中获取两个绝对路径之间的相对路径?

时间:2019-11-13 14:49:19

标签: python python-3.x pathlib

在Python 3中,我使用pathlib定义了两条路径,例如:

from pathlib import Path

origin = Path('middle-earth/gondor/minas-tirith/castle').resolve()
destination = Path('middle-earth/gondor/osgiliath/tower').resolve()

如何获取从origindestination的相对路径?在此示例中,我想要一个返回../../osgiliath/tower或等效值的函数。

理想情况下,我会有一个始终满足的功能relative_path

origin.joinpath(
    relative_path(origin, destination)
).resolve() == destination.resolve()

(嗯,理想情况下会有一个运算符-使得destination == origin / (destination - origin)始终为真)

请注意,在这种情况下,Path.relative_to是不够的,因为origin不是destination的父母。另外,我不使用符号链接,因此可以安全地假设没有任何符号链接,这样可以简化问题。

如何实施relative_path

2 个答案:

答案 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位)上进行了测试)