Python:获得路径中所有父项的可迭代的优雅方式

Bob*_*bby 1 python iterable

使用基于路径的资源系统,应用程序需要根据路径查找管理给定资源的第一个工作资源.我需要一种简洁,pythonic的方式来生成以下内容:

输入:

/house/dogs/ralph/bone
Run Code Online (Sandbox Code Playgroud)

输出:

/house/dogs/ralph/bone
/house/dogs/ralph
/house/dogs
/house
Run Code Online (Sandbox Code Playgroud)

注意:可以使用os.path或类似的内置函数,但这些不是文件系统资源.输出可以是任何可迭代的(列表,集合,生成器等).

Mad*_*ist 5

使用pathlib.PurePaths为与文件系统无关的路径类对象提供抽象接口.特别PurePosixPath是,使用正斜杠(/)作为分隔符的类型:

>>> from pathlib import PurePosixPath
>>> p = PurePosixPath('/house/dogs/ralph/bone')
>>> str(p.parent)
/house/dogs/ralph
>>> str(p.parent.parent)
/house/dogs
Run Code Online (Sandbox Code Playgroud)

你可以轻松地循环:

p = PurePosixPath(...)
while p != p.root:
    # Do stuff to p
    p = p.parent
Run Code Online (Sandbox Code Playgroud)

一个相当pythonic完成触摸将使它成为一个发电机:

def receding_path(p):
    p = PurePosixPath(p)
    while p != p.root:
        yield str(p)
        p = p.parent

for item in receding_path('/house/dogs/ralph/bone'):
    # do stuff to each item
Run Code Online (Sandbox Code Playgroud)