如何获取父目录位置

173 投票
13 回答
264782 浏览
提问于 2025-04-15 22:37

这段代码是在 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__),".."))

13 个回答

69

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'
77

在Python 3.4及以上版本中,使用相对路径pathlib模块:

from pathlib import Path

Path(__file__).parent

你可以多次调用parent来向路径上更高的层级移动:

Path(__file__).parent.parent

作为一种替代方法,如果不想调用parent两次,你可以使用:

Path(__file__).parents[1]
227

你可以多次使用dirname这个函数来向上爬,比如用dirname(dirname(file))。不过,这样做最多只能到达根目录。如果你需要更高的层级,可以使用os.path.abspath,像这样:dirname(dirname(abspath(file)))

撰写回答