Python习惯用法,以获得与多次调用os.path.dirname相同的结果?

Python习惯用法,以获得与多次调用os.path.dirname相同的结果?,python,build,filepath,os.path,dirname,Python,Build,Filepath,Os.path,Dirname,我发现自己需要在一个源代码树中获取python文件的父目录,该源代码树具有一定的规则性,包含多个目录。不得不多次叫dirname是很笨拙的 我环顾四周,惊讶地发现没有关于这个的帖子 一般情况是: import os.path as op third_degree_parent = op.dirname(op.dirname(op.dirname(op.realpath(__file__)))) 有没有一种更惯用的方法不需要嵌套的dirname调用呢?规范化相对路径;是父目录,请根据需要重复多次

我发现自己需要在一个源代码树中获取python文件的父目录,该源代码树具有一定的规则性,包含多个目录。不得不多次叫dirname是很笨拙的

我环顾四周,惊讶地发现没有关于这个的帖子

一般情况是:

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

有没有一种更惯用的方法不需要嵌套的dirname调用呢?

规范化相对路径;是父目录,请根据需要重复多次。也可通过
os.path.pardir
访问:

import os.path as op

op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir))
给定一个目录
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'

因为它还没有被证明,这里是一个使用函数的答案

功能

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)
解释

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的dirname
  • 进程递归重复,直到级别达到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'

4年后的2018年,有人添加了答案,那么为什么不添加我的答案呢。其他答案要么长,要么变长,如果需要更多的家长。假设你需要7个父母。我就是这么做的

os.path.abspath(__file__ + 8 * '/..')
请注意额外的(8=7+1)以删除7个父项以及文件名。无需使用
os.path.pardir
,因为
abspath
普遍理解
/..
,并且会做正确的事情。还有一个优点,即父级的数量可以是动态的,在运行时确定

相比之下,使用公认答案的等价物(较长且不太明显):


我将用N扩展已接受的答案

import os.path as op

op.abspath(op.join(__file__, \*N\*[op.pardir]))

这正是我想要的。作为后续行动,如果这种方法受到任何角落案例的影响,该怎么办?@TimWilder:我现在想不出有什么;如果您发现任何问题,请告诉我,我将看看我们如何解决这些问题;我需要考虑op.join方法和路径之间的相互作用/阅读一些文章,以便更全面地探索这一点。一般关注的是os.path.abspath与os.path.realpath。@TimWilder:
realpath
在引擎盖下使用
abspath
,所以请随时更换呼叫。很高兴知道。我觉得这是对dirname通话的清晰性和简洁性的改进,所以谢谢。请在您的回答中添加一些解释,以帮助人们更好地理解。我添加了解释和示例。
import os.path as op

op.abspath(op.join(__file__, \*N\*[op.pardir]))