如何获取父目录位置


131

这段代码是在b.py中获取templates / blog1 / page.html:

path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))

但我想获取父目录位置:

aParent
   |--a
   |  |---b.py
   |      |---templates
   |              |--------blog1
   |                         |-------page.html
   |--templates
          |--------blog1
                     |-------page.html

以及如何获取父位置

谢谢

更新:

这是对的:

dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))

要么

path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))

2
所以你想得到blog1还是a?您当前的文件在哪里?
菲利克斯·克林

您了解您的代码在做什么吗?
SilentGhost 2010年

1
是的,它获取了templates / blog1 / page.html
zjm1126'5

os.path.join('templates', 'blog1/page.html')我看起来很奇怪 您正在混淆。无论是os.path.join('templates', 'blog1', 'page.html')'templates/blog1/page.html'。而且很容易会os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
费利克斯·克林

1
@zjm:不,您没有得到该页面。这不是您可以用来获取模板文件的一些黑匣子。它执行了一系列琐碎的小步骤,如果您能理解它们,那么您就不会有这个问题了。
SilentGhost 2010年

Answers:


173

您可以重复应用dirname来爬高:dirname(dirname(file))。但是,这只能到达根包。如果有问题,请使用os.path.abspathdirname(dirname(abspath(file)))


37
我知道OP知道dirname。并非所有人都知道将目录名应用于目录会产生父目录。
马塞洛·坎托斯

4
dirname不要总是返回上一级目录; twitter.com/#!/ActiveState/status/671049326788608
Sridhar Ratnakumar,2010年

2
@Sridhar:这取决于你的观点;我认为结尾的路径/不代表叶目录条目本身,而是其内容,这就是为什么例如mv xxx yyy/如果yyy不是预先存在的目录则失败的原因。无论如何,即使我们以您的观点为准,但这与我的回答无关。无论是file还是结果dirname都不会以/
马塞洛·坎托斯

1
较小的更正:dirname可能会返回'/',显然以结尾/。唯一的例外是AFAIK。
Marcelo Cantos

55

os.path.abspath不会验证任何内容,因此,如果我们已经向其追加字符串,__file__则无需理会dirname或加入其中的任何一个。只需将其__file__视为目录并开始爬山:

# climb to __file__'s parent's parent:
os.path.abspath(__file__ + "/../../")

这远不os.path.abspath(os.path.join(os.path.dirname(__file__),".."))及易处理dirname(dirname(__file__))。攀登两个以上的水平开始变得荒谬。

但是,由于我们知道要爬多少层,我们可以用一个简单的小函数来清理它:

uppath = lambda _path, n: os.sep.join(_path.split(os.sep)[:-n])

# __file__ = "/aParent/templates/blog1/page.html"
>>> uppath(__file__, 1)
'/aParent/templates/blog1'
>>> uppath(__file__, 2)
'/aParent/templates'
>>> uppath(__file__, 3)
'/aParent'

2
很好,但是如果标准库添加了一个方便的功能来完成此任务,那也将很酷...不想每次都需要此功能时就来找我
gradi3nt 2016年

4
os.path.abspath(os.path.join(__file__, "..", "..")更便携吗?
slowD

40

相对路径pathlibPython 3.4+中的模块一起使用:

from pathlib import Path

Path(__file__).parent

您可以使用多个调用来parent进一步进行以下操作:

Path(__file__).parent.parent

作为指定parent两次的替代方法,可以使用:

Path(__file__).parents[1]

2
如果由于要修改路径而需要将路径作为字符串,则可以使用str(Path(__file__).parent)
菲利普

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

应该给你通往的道路a

但是,如果b.py当前执行的是文件,则只需执行以下操作即可

os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))

1
o,我知道,您说得对,我想获取a的父文件夹。如何获取
zjm1126'5

@ zjm1126:请参阅Marcelo Cantos的答案。申请dirname()两次。您现在需要的所有内容都应该在此站点上。
菲利克斯·克林

9

os.pardir是一种更好的方法../,更具可读性。

import os
print os.path.abspath(os.path.join(given_path, os.pardir))  

这将返回给定路径的父路径


5

一种简单的方法可以是:

import os
current_dir =  os.path.abspath(os.path.dirname(__file__))
parent_dir = os.path.abspath(current_dir + "/../")
print parent_dir

3

可能是加入两个..文件夹,以获取父文件夹的父文件夹?

path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"..",".."))

3

使用以下命令跳到上一个文件夹:

os.chdir(os.pardir)

如果您需要多次跳转,那么在这种情况下,使用简单的装饰器是一个好而简单的解决方案。


1

这是另一个相对简单的解决方案:

  • 不使用dirname()(在“ file.txt”这样的一级参数或“ ..”这样的相对父级上不能按预期工作)
  • 不使用abspath()(避免对当前工作目录进行任何假设),而是保留路径的相对字符

它只是使用normpathjoin

def parent(p):
    return os.path.normpath(os.path.join(p, os.path.pardir))

# Example:
for p in ['foo', 'foo/bar/baz', 'with/trailing/slash/', 
        'dir/file.txt', '../up/', '/abs/path']:
    print parent(p)

结果:

.
foo/bar
with/trailing
dir
..
/abs

0

我认为用这个更好:

os.path.realpath(__file__).rsplit('/', X)[0]


In [1]: __file__ = "/aParent/templates/blog1/page.html"

In [2]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[3]: '/aParent'

In [4]: __file__ = "/aParent/templates/blog1/page.html"

In [5]: os.path.realpath(__file__).rsplit('/', 1)[0]
Out[6]: '/aParent/templates/blog1'

In [7]: os.path.realpath(__file__).rsplit('/', 2)[0]
Out[8]: '/aParent/templates'

In [9]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[10]: '/aParent'

不完全是,这取决于操作系统(在Windows上不起作用)。同样,它不允许使用相对路径。
kgadek 2014年

那是一个糟糕的解决方案。不适用于所有操作系统
web.learner

0

我试过了:

import os
os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.