【问题标题】:Is there a way to use Pathlib to traverse parents folders until a name matches?有没有办法使用 Pathlib 遍历父文件夹直到名称匹配?
【发布时间】:2022-11-22 20:33:55
【问题描述】:

我正在与一位同事讨论是否有内置(或干净)的方法来使用 Pathlib 遍历任意路径以查找给定的父文件夹,例如存储库的根目录(每个用户可能有所不同)所述回购协议的本地副本)。我在下面模拟了所需的行为:

from pathlib import Path

def find_parent(path: Path, target_parent):
    for part in path.parts[::-1]:
        if part != target_parent:
            path = path.parent
        else:
            break
    return path

path = Path("/some/arbitrarily/long/path/ROOT_FOLDER/subfolder1/subfolder2/file.py")
root = find_parent(path, "ROOT_FOLDER")
assert root == Path("/some/arbitrarily/long/path/ROOT_FOLDER")

有没有更简单的方法来实现这一目标?

【问题讨论】:

  • while path.name != 'ROOT_FOLDER' and path.parent != path: path = path.parent?这将迭代到根。最后,您需要检查结果路径是否不是/(如果找不到目录,它将是),与 while 条件(if path == path.parent: raise RuntimeError('Wrong location: make sure you are located in a proper directory')相同。
  • assert root == Path 是做什么的?
  • @Bhargav 这只是为了展示我试图用这段代码 sn-p 实现的目标。
  • 明白了……明白了
  • 尽管您的解决方案没问题(除了缺少返回 - 它应该是return path而不是break)。这个问题更适合 CodeReview SE,因为您有工作代码并且想知道它是否可以改进并且没有实际问题。

标签: python pathlib


【解决方案1】:

您可以直接遍历 path.parents(复数),这样会更简洁一些:

def find_parent(path: Path):
    for parent in path.parents:
        if parent.name == "ROOT_FOLDER":
            return parent

(不需要 else 子句。)

假设 "ROOT_FOLDER" 不应该被硬编码,最好将它作为第二个参数传递给函数:

def find_parent(path: Path, parent_name: str = "SOME_DEFAULT"):

【讨论】:

  • 啊。我认为这是结束,但不是:path.parents 不包含 path 本身。如果 path 是 Path('/tmp/foo/bar/ROOT_FOLDER'),这将失败
  • 我根据您的第一个代码块添加了自己的答案。非常感谢!
【解决方案2】:

根据@Chris 的回答,我发现下面的一句话就是我所追求的:

root = [parent for parent in path.parents if parent.name == "ROOT_FOLDER"][0]

【讨论】:

  • 如果没有父母匹配,这将失败并显示 IndexError
猜你喜欢
  • 2016-04-28
  • 2016-01-16
  • 2019-01-21
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2022-01-13
  • 2019-11-11
  • 1970-01-01
相关资源
最近更新 更多