12

我发现自己需要在源代码树中获取 python 文件的父目录,该目录是多个目录,并且有一定的规律性。必须多次调用 dirname 很笨拙。

我环顾四周,很惊讶没有找到关于此的帖子。

一般情况是:

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

有没有更惯用的方法来做到这一点,不需要嵌套的 dirname 调用?

4

5 回答 5

15

规范化相对路径;os.pardir是父目录,根据需要重复多次。它也可以通过以下方式获得os.path.pardir

import os.path as op

op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir))
于 2014-09-12T19:03:37.710 回答
4
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'
于 2016-01-05T00:24:51.203 回答
4

由于尚未演示,这里是使用递归函数的答案。

功能

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,则函数调用自身,使其获取目录名的目录名
  • 过程递归地重复,直到级别达到 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'
于 2018-01-18T21:05:39.623 回答
4

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

os.path.abspath(__file__ + 8 * '/..')

注意额外的 (8=7+1) 删除 7 个父项以及文件名。不需要os.path.pardiras普遍abspath理解并且会做正确的事。/..还有一个优点是父母的数量可以是动态的,在运行时确定。

相比之下,使用公认答案的等效项(更长且不太明显):

import os.path as op
op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir, op.pardir, op.pardir, op.pardir, op.pardir))
于 2018-05-05T11:34:50.840 回答
0

我将用 N 扩展接受的答案

import os.path as op

op.abspath(op.join(__file__, \*N\*[op.pardir]))
于 2019-05-06T07:47:19.987 回答