如何获取父目录位置

时间:2010-05-12 08:57:46

标签: python path

此代码在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

以及如何获取aParent位置

感谢

更新

这是对的:

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__),".."))

11 个答案:

答案 0 :(得分:150)

您可以反复应用dirname以爬升:dirname(dirname(file))。但是,这只能到根包。如果这是一个问题,请使用os.path.abspathdirname(dirname(abspath(file)))

答案 1 :(得分:49)

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 :(得分:25)

在Python 3.4 +中使用相对路径pathlib模块:

from pathlib import Path

Path(__file__).parent

您可以使用parent的多个来电进一步了解路径:

Path(__file__).parent.parent

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

Path(__file__).parents[1]

答案 3 :(得分:11)

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

应该为您提供a的路径。

但如果b.py是当前执行的文件,那么只需执行相同的操作

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

答案 4 :(得分:8)

os.pardir../更好的方式,更具可读性。

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

这将返回given_path的父路径

答案 5 :(得分:4)

一种简单的方法可以是:

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:3)

使用以下内容跳转到上一个文件夹:

os.chdir(os.pardir)

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

答案 8 :(得分: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

答案 9 :(得分: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'

答案 10 :(得分:0)

我试过了:

import os
os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))