python:如何获取父目录的绝对路径

时间:2017-10-24 07:18:02

标签: python path glob

我在位置a/b/c/d/e/f/x.xml有一个文件。我需要找到dir d的绝对路径,即与dir名称d匹配的层次结构中的父目录。

我可以获取文件名的当前目录os.path.abspath(__file__)。我看到了pathlibglob的文档,但我无法弄清楚如何使用它们。

有人可以提供帮助

编辑:

感谢下面的所有答案,我已经有了一个班轮

os.path.join(*list(itertools.takewhile(lambda x: x != 'd', pathlib.PurePath(os.getcwd()).parts)))

我还需要在其中附加实际的目录名称,即输出应为a/b/c/d。下面是一个丑陋的解决方案(使用os.path.join两次)。有人可以修复它(通过向迭代器或一行中的列表添加元素:)

os.path.join(os.path.join(*list(itertools.takewhile(lambda x: x != 'd', pathlib.PurePath(os.getcwd()).parts))),"d")

5 个答案:

答案 0 :(得分:2)

您可以使用dirname abspath __file__来获取x.xml的完整路径

os.path.dirname(os.path.abspath(__file__))

>>> import pathlib
>>> p = pathlib.PurePath('a/b/c/d/e/f/x.xml')
>>> p.parts
('a', 'b', 'c', 'd', 'f', 'x.xml')

然后,您可以提取路径的任何部分。如果您想获取d文件夹:

import itertools
res = '/'.join(itertools.takewhile(lambda x: x != 'd', p.parts))

答案 1 :(得分:2)

您可以使用pathlib' Path.resolve()Path.parents

from pathlib import Path

path = Path("a/b/c/d/e/f/x.xml").resolve()

for parent in path.parents:
    if parent.name == "d":  # if the final component is "d", the dir is found
        print(parent)
        break

答案 2 :(得分:0)

使用正则表达式并剪切:

import re
import os
mydir_regexp = re.compile('dirname')
abs_path = os.path.abspath(__file__)
s = re.search(mydir_regexp, abs_path)

my_match = abs_path[:abs_path.index(s.group())+len(s.group())]

答案 3 :(得分:0)

假设您当前目录中有一个文件,您可以使用abspath获取绝对路径(从root开始):

path = os.path.abspath(filename)

魔术词是os.path.split,它将路径名分成最后一个组件和头部(前面的一切)。因此,要获得d之前的绝对路径,只需迭代组件:

def findinit(path, comp):
    while (len(path) > 1):
        t = os.path.split(path)
        if t[1] == comp:
            return t[0]
        path = t[0]
    return None

您可以按预期findinit('/a/b/c/d/e/f/x.xml')

控制/a/b/c

或者,如果您想使用pathlib模块,可以在parts搜索特定组件:

def findinit(path, comp):
    p = pathlib.PurePath(path)
    i = p.parts.index(comp)
    if i != -1:
        return pathlib.PurePath(*p.parts[:i])
    return None

答案 4 :(得分:0)

我终于找到了一行:

os.path.join(*list(itertools.takewhile(lambda x: x != 'd', pathlib.PurePath(os.getcwd()).parts)),"d")
但是,如果没有别人的答案,那就不可能了。非常感谢。

相关问题