您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python:通过比较两个绝对路径获得相对路径

Python:通过比较两个绝对路径获得相对路径

os.path.commonprefix()os.path.relpath()是您的朋友:

>>> print os.path.commonprefix(['/usr/var/log', '/usr/var/security'])
'/usr/var'
>>> print os.path.commonprefix(['/tmp', '/usr/var'])  # No common prefix: the root is the common prefix
'/'

因此,您可以测试公共前缀是否是路径之一,即,其中一个路径是否是公共祖先:

paths = […, …, …]
common_prefix = os.path.commonprefix(list_of_paths)
if common_prefix in paths:
    …

然后,您可以找到相对路径:

relative_paths = [os.path.relpath(path, common_prefix) for path in paths]

您甚至可以使用此方法处理两条以上的路径,并测试所有路径是否都在其中一条路径以下。

:根据您的路径看起来,您可能需要首先执行一些规范化(这在不知道它们是否总是以“ /”结尾或某些路径是相对路径的情况下很有用)。相关功能包括os.path.abspath()os.path.normpath()

:正如Peter Briggs在评论中提到的那样,上述简单方法可能会失败:

>>> os.path.commonprefix(['/usr/var', '/usr/var2/log'])
'/usr/var'

即使/usr/var没有 路径的一个共同的前缀。在调用之前强制所有路径以“ /”结尾commonprefix()解决此(特定)问题。

:如bluenote10所述,添加斜杠不能解决一般问题。

:从Python 3.4开始,我们有pathlib,该模块提供了更合理的路径操作环境。我猜想,可以通过获取每个路径的所有前缀(带有PurePath.parents()),获取所有这些父集的交集并选择最长的公共前缀来获得一组路径的公共前缀。

:Python 3.5为这个问题引入了适当的解决方案:os.path.commonpath(),它返回有效路径。

python 2022/1/1 18:41:43 有280人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶