我在位置a/b/c/d/e/f/x.xml
有一个文件。我需要找到dir d
的绝对路径,即与dir名称d
匹配的层次结构中的父目录。
我可以获取文件名的当前目录os.path.abspath(__file__)
。我看到了pathlib和glob的文档,但我无法弄清楚如何使用它们。
有人可以提供帮助
编辑:
感谢下面的所有答案,我已经有了一个班轮
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")
答案 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")
但是,如果没有别人的答案,那就不可能了。非常感谢。