我发现自己需要在源代码树中获取 python 文件的父目录,该目录是多个目录,并且有一定的规律性。必须多次调用 dirname 很笨拙。
我环顾四周,很惊讶没有找到关于此的帖子。
一般情况是:
import os.path as op
third_degree_parent = op.dirname(op.dirname(op.dirname(op.realpath(__file__))))
有没有更惯用的方法来做到这一点,不需要嵌套的 dirname 调用?
规范化相对路径;os.pardir
是父目录,根据需要重复多次。它也可以通过以下方式获得os.path.pardir
:
import os.path as op
op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir))
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'
由于尚未演示,这里是使用递归函数的答案。
功能
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)
解释
例子
>>> 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
as普遍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))
我将用 N 扩展接受的答案
import os.path as op
op.abspath(op.join(__file__, \*N\*[op.pardir]))