Python成语与获取多次调用os.path.dirname相同的结果?

问题描述:

我发现自己需要在源树中获得一个python文件的父目录,该目录是具有一定规律性的多个目录。不得不多次致电dirname是笨重的。Python成语与获取多次调用os.path.dirname相同的结果?

我环顾四周,很惊讶没有找到这个帖子。

的一般情况是:

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

有没有一种更地道的方式来做到这一点,并不需要嵌套的目录名电话?

标准化相对路径; 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

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

由于尚未证实,这里是使用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'