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))
答
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'
答
由于尚未证实,这里是使用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'
这正是我一直在寻找。作为后续行动,如果有任何角落案例会受到哪些影响? – 2014-09-12 19:05:15
@TimWilder:我现在没有想到的;如果你找到了,告诉我,我会看看我们如何解决这些问题。 – 2014-09-12 19:11:25
我在考虑符号链接的问题;我需要考虑op.join方法和路径之间的相互作用/做一些阅读以更充分地探索这一点。一般关心的是os.path.abspath与os.path.realpath。 – 2014-09-12 19:15:47