如何使用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()
如何获得从origin
到destination
的相对路径?在这个例子中,我想要一个 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 位上测试)
在Python3中,我使用pathlib
定义了两条路径,比如:
from pathlib import Path
origin = Path('middle-earth/gondor/minas-tirith/castle').resolve()
destination = Path('middle-earth/gondor/osgiliath/tower').resolve()
如何获得从origin
到destination
的相对路径?在这个例子中,我想要一个 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 位上测试)