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

How to get the relative path between two absolute paths in Python using pathlib?

在Python3中,我使用pathlib定义了两条路径,比如:

from pathlib import Path

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

如何获得从origindestination的相对路径?在这个例子中,我想要一个 returns ../../osgiliath/tower 或等价的函数。

理想情况下,我有一个函数 relative_path 总是满足

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

(好吧,理想情况下会有一个运算符-使得destination == origin / (destination - origin)永远为真)

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

如何实现relative_path

这很简单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'

如果您希望自己的 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 位上测试)