【问题标题】:How to get a specific parent of a path by its name?如何通过名称获取路径的特定父级?
【发布时间】:2020-07-15 23:39:36
【问题描述】:

我有一个函数,它返回我通过常量名称查找的 特定 父级的完整路径。我目前正在使用os.path 和字符串作为路径,所以现在这是使用正则表达式完成的。

我想要的是例如一个常量parent = d 能够得到:

/a/b/c/d/e      -->  /a/b/c/d
/a/b/c/d/e/f    -->  /a/b/c/d
/root/a/b/c/d/e -->  /root/a/b/c/d

注意:如示例所示,我不想依赖双方的任何固定位置。

我尝试了两种方法,但都感觉有点笨拙:

  1. 使用parts 以找到正确的parents 元素:

    >>> path = "/a/b/c/d/e/f"
    >>> parts = Path(path).parts
    >>> parent_index = len(parts) - 1 - parts.index('d') - 1
    >>> Path(path).parents[parent_index]
    PosixPath('/a/b/c/d')
    
  2. 使用parts 并连接相关的:

    >>> path = "/root/a/b/c/d/e"
    >>> parts = Path(path).parts
    >>> Path(*parts[:parts.index('d')+1])
    PosixPath('/root/a/b/c/d')
    

我会说第二个似乎是合理的,但我的问题仍然是:有没有更直接的 pythonic 方法来实现这一点? parents 的重复索引和切片感觉效率低下且相当混乱。


附:如果该部分不存在于路径中,则足以引发异常或任何指示符(现在我用index 将代码与try/except 包装在一起)。

【问题讨论】:

  • os.path.dirname(mypath)
  • @Todd os.path.dirname("/a/b/c/d/e/f") 将提供'/a/b/c/d/e',但我正在寻找'/a/b/c/d',如上例所述
  • 再次调用 os.path.dirname() =)
  • 如果您的应用程序正在尝试获取以“d”结尾的所有文件路径的列表,您也许可以使用glob.glob('**/d', recursive=True) - 但不要从根目录执行此操作,因为它'会永远。您可能希望将其限制为特定的文件夹树。
  • @Todd,正如您在示例中看到的那样,父母的数量各不相同。至于glob,这会从系统中调出很多结果,我只需要给定文件路径中的那个

标签: python python-3.x pathlib


【解决方案1】:

您可以改用while 循环来继续向后搜索给定名称的父级:

path = Path("/a/b/c/d/e/f")
while path.name != 'd':
    path = path.parent
    assert path.name, 'No parent found with the given name'
print(path)

这个输出:

/a/b/c/d

【讨论】:

  • 感谢@blhsing,这确实传达了以可读方式向后搜索的想法,并且可能比parts 方法更有效,因为现在创建了额外的列表并且没有切片。我可能会在我的代码中使用它。谢谢!
【解决方案2】:

您可以拆分和加入您的字符串并使用项目 +1 的索引

path='/a/b/c/d/e/f'
lpath=path.split('/')
index=lpath.index('d')+1
'/'.join(lpath[0:index])

输出:

'/a/b/c/d'

【讨论】:

  • 嗨@Willian,感谢您的回答!我没有在问题中明确说明,但我希望代码是可移植的并且不使用字符串方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2016-07-11
  • 2020-12-06
  • 2016-12-29
相关资源
最近更新 更多