如何获得父目录位置
这个代码是得到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.abspath
: dirname(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的相对特征
它只是使用normpath
并join
:
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))