如何得到父目录的位置

这段代码是在 b.py 中获取 template/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__),".."))
223305 次浏览

你可以重复使用 diname 来爬得更高: dirname(dirname(file))。但是,这只能到根包为止。如果这是一个问题,使用 os.path.abspath: dirname(dirname(abspath(file)))

可以加入两个 ..文件夹,得到父文件夹的父文件夹吗?

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

应该能找到通往 a的路。

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

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

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'

一个简单的方法可以是:

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

对于 ../来说,os.pardir是一种更好的方式,也更易读。

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

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

我觉得用这个更好:

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'

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

  • 不使用 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

我试过:

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

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

os.chdir(os.pardir)

如果您需要多次跳转,一个好的和容易的解决方案将使用一个简单的装饰在这种情况下。

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

from pathlib import Path


Path(__file__).parent

您可以使用对 parent的多个调用来进一步完成以下任务:

Path(__file__).parent.parent

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

Path(__file__).parents[1]
从 os.path 导入 basename,dirname
Basename (dirname (‘ foo/bar/foo _ bar’)