2010-05-12 77 views
94

這個代碼是獲得模板/ blog1/page.html中的b.py:如何獲得的父目錄位置

path = os.path.join(os.path.dirname(__file__), os.path.join('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__),"..")) 
+2

所以你想獲得'blog1'或'a'?你當前的文件位於哪裏? – 2010-05-12 09:03:26

+0

你知道你的代碼在做什麼嗎? – SilentGhost 2010-05-12 09:07:00

+1

是的,它得到的模板/ blog1/page.html – zjm1126 2010-05-12 09:09:20

回答

114

您可以將目錄名反覆攀升:dirname(dirname(file))。然而,這隻能和根包一樣。如果這是個問題,請使用os.path.abspathdirname(dirname(abspath(file)))

+1

他似乎知道'dirname' – SilentGhost 2010-05-12 09:05:35

+29

我知道OP知道'dirname'。大家都不明白,將dirname應用於目錄會生成父目錄。 – 2010-05-12 09:09:01

+0

嗨Marcelo,看看更新的 – zjm1126 2010-05-12 09:24:58

3

可能會加入兩個..文件夾,以獲取父文件夾的父級?

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

應該給你的路徑a

但如果b.py是當前執行的文件,那麼你可以通過只是在做

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

啊,我知道,你是對的,我想獲得一個的父文件夾。如何得到它 – zjm1126 2010-05-12 09:43:24

+0

@ zjm1126:見馬塞洛Cantos的答案。應用'dirname()'兩次。現在你需要的一切應該在這個網站上。 – 2010-05-12 09:51:50

37

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' 
+0

我喜歡這個答案最好^ – Stephen 2013-07-19 03:56:57

+0

非常好的方法 – MA1 2014-07-04 06:11:25

+2

這是好的,但它也將是冷靜,如果標準庫補充說,做到了這一點......不想來,所以我需要這個FUNC – gradi3nt 2016-01-27 17:26:57

2

一個簡單的方法可以是:

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

os.pardir是一個更好的方式爲../,更具可讀性。

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

這將返回given_path的父路徑

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' 
+0

每次方便的功能不完全是,它取決於操作系統(不適用於Windows)。也不允許使用相對路徑。 – kgadek 2014-10-22 17:49:46

0

這裏是另一個相對簡單的解決方案:

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

我試過了:

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

使用下列跳轉到一個文件夾:

os.chdir(os.pardir) 

如果需要多個跳躍一個良好的和簡單的解決方案將是在這種情況下,使用簡單的裝飾。

12

您可以使用在Python 3.4+的pathlib模塊:

from pathlib import Path 

Path(__file__).parent 

您可以使用多個呼叫parent走得更遠路徑:

Path(__file__).parent.parent 

作爲替代指定parent兩次,你可以使用

Path(__file__).parents[1]