当前位置: 首页 > 面试题库 >

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

耿俊
2023-03-14
问题内容

说,我有两条绝对路径。我需要检查其中一条路径所指的位置是否为另一条路径的后代。如果为true,则需要从祖先找出后代的相对路径。用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]

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

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

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

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

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

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

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

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



 类似资料:
  • 主要内容:什么是当前工作目录,什么是绝对路径与相对路径,Python处理绝对路径和相对路径在介绍绝对路径和相对路径之前,先要了解一下什么是当前工作目录。 什么是当前工作目录 每个运行在计算机上的程序,都有一个“当前工作目录”(或 cwd)。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。 注意,虽然文件夹是目录的更新的名称,但当前工作目录(或当前目录)是标准术语,没有当前工作文件夹这种说法。 在 Python 中,利用 os.getcwd() 函数可以取得当前工作路径的字

  • 问题内容: 如果使用绝对路径,则无法将整个目录移动到新位置。如果使用相对路径,则无法将单个文件移动到新位置。 这里有什么解决方案?您是否设置了一个包含根路径并从那里开始的配置文件?还是您有类似的规则:永不移动文件? 我在某些项目中看到人们使用dirname( FILE )。我的意思是,为什么不简单地将其删除,因为目录名还是相对的(取决于文件所在的位置)? 问题答案: 您应该使用一个配置文件,该配置

  • 问题内容: 我正在编写一个程序,其中的一个组件必须能够采用给定的路径(例如或)和基于该位置的相对路径(例如或或)并产生绝对路径由相对路径暗示。考虑以下目录树。 该文件包含一个链接,如。该计划获得通过或,并将其与结合来获得。 同样,文件具有链接,程序需要从该链接返回。有合理的方法做到这一点吗? 谢谢。:) 编辑: 谢谢斯蒂芬·温伯格!对于未来的每个人,这是我使用的代码。 问题答案: 在与使用时应该做

  • 在 Linux 中,简单的理解一个文件的路径,指的就是该文件存放的位置,例如,在《 Linux文件系统的层次结构》中提到的 /home/cat 就表示的是 cat 文件所存放的位置。只要我们告诉 Linux 系统某个文件存放的准确位置,那么它就可以找到这个文件。 指明一个文件存放的位置,有 2 种方法,分别是使用 绝对路径和 相对路径。 我们知道,Linux 系统中所有的文件(目录)都被组织成以根

  • 问题内容: 键入标题时,我注意到有关此问题的一些类似问题,但它们似乎不在PHP中。那么用PHP函数解决该问题的方法是什么? 待指定。 有什么好主意吗?谢谢。 问题答案: 试试这个: 这将给 和 和 和

  • 问题内容: 我有文件A的绝对路径。 我有一个从文件A的目录到文件B的相对路径。此路径可以并且将使用“ ..”以任意复杂的方式向上移动目录结构。 范例A: 示例B: 我如何结合这两者以获得 最简单的 绝对路径到文件B? 问题答案: 如果我的问题正确,那么您可以执行以下操作: