如何获得父目录位置

这个代码是得到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__),"..")) 

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

os.path.abspath不会validation任何东西,所以如果我们已经将string附加到__file__那么不需要打扰dirname或join或任何。 只要把__file__作为一个目录,并开始攀登:

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

这比os.path.abspath(os.path.join(os.path.dirname(__file__),".."))和about和dirname(dirname(__file__))易于pipe理。 攀登两个以上的水平开始变得荒谬。

但是,既然我们知道要爬上多less层次,我们可以用一个简单的小函数来清理它:

 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' 

您可以在Python 3.4+中使用pathlib模块:

 from pathlib import Path Path(__file__).parent 

您可以使用多个呼叫到parent进一步在path中:

 Path(__file__).parent.parent 

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

 Path(__file__).parents[1] 
 os.path.dirname(os.path.abspath(__file__)) 

应该给你的path。

但是,如果b.py是当前正在执行的文件,那么只要做到这一点就可以达到同样的效果

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

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

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

这将返回给定path的父path

可能是join两个..文件夹,获取父文件夹的父母?

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

一个简单的方法可以是:

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

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

 os.chdir(os.pardir) 

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

我觉得用这个比较好:

 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' 

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

  • 不使用dirname() (它不能像预期的那样在一个级别的参数(比如“file.txt”或者相对的父母像“..”)上工作)
  • 不使用abspath() (避免关于当前工作目录的任何假设),而是保留path的相对特征

它只是使用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))