Python习惯用法,以获得与多次调用os.path.dirname相同的结果?
我发现自己需要在一个源代码树中获取python文件的父目录,该源代码树具有一定的规则性,包含多个目录。不得不多次叫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调用呢?规范化相对路径;是父目录,请根据需要重复多次
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]))