2014-09-12 55 views
4

我發現自己需要在源樹中獲得一個python文件的父目錄,該目錄是具有一定規律性的多個目錄。不得不多次致電dirname是笨重的。Python成語與獲取多次調用os.path.dirname相同的結果?

我環顧四周,很驚訝沒有找到這個帖子。

的一般情況是:

import os.path as op 
third_degree_parent = op.dirname(op.dirname(op.dirname(op.realpath(__file__)))) 

有沒有一種更地道的方式來做到這一點,並不需要嵌套的目錄名電話?

回答

7

標準化相對路徑; os.pardir是父目錄,根據需要重複多次。它通過os.path.pardir也可用:

import os.path as op 

op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir)) 
+0

這正是我一直在尋找。作爲後續行動,如果有任何角落案例會受到哪些影響? – 2014-09-12 19:05:15

+0

@TimWilder:我現在沒有想到的;如果你找到了,告訴我,我會看看我們如何解決這些問題。 – 2014-09-12 19:11:25

+0

我在考慮符號鏈接的問題;我需要考慮op.join方法和路徑之間的相互作用/做一些閱讀以更充分地探索這一點。一般關心的是os.path.abspath與os.path.realpath。 – 2014-09-12 19:15:47

1
def updir(d, n): 
    """Given path d, go up n dirs from d and return that path""" 
    ret_val = d 
    for _ in range(n): 
    ret_val = os.path.dirname(ret_val) 
    return ret_val 

給出一個目錄d = '/path/to/some/long/dir'您可以用上面的功能,只要你想上去爲多個層級。例如:

updir(d,0) 
'/path/to/some/long/dir' 
updir(d,1) 
'/path/to/some/long' 
updir(d,2) 
'/path/to/some' 
updir(d,3) 
'/path/to' 
updir(d,4) 
'/path' 
+0

請在答案中添加一點解釋以幫助人們更好地理解。 – Haris 2016-01-05 03:29:45

+0

我加了一個解釋和例子。 – cs01 2016-01-05 20:32:31

1

由於尚未證實,這裏是使用recursive功能的答案。

功能

import os 
def parent(path, level = 0): 
    parent_path = os.path.dirname(path) 
    if level == 0: 
     return parent_path 
    return parent(parent_path, level - 1) 

  • 得到一個路徑的目錄名稱是輸入
  • 如果水平不爲0,函數調用自身,使其獲得dirname的主目錄名稱
  • 過程以遞歸方式重複L電平達到0

>>> parent('/my/long/path/name/with/a/file.txt') 
'/my/long/path/name/with/a' 
>>> parent('/my/long/path/name/with/a/file.txt', 0) 
'/my/long/path/name/with/a' 
>>> parent('/my/long/path/name/with/a/file.txt', 4) 
'/my/long' 
相關問題