如何从单一路径获取上层路径?

时间:2009-03-26 22:52:39

标签: python directory

如何从单一路径获取上层路径?

所以说你有一条道路:

'C:\a\b\c\d\'

如何访问'C:\a\b''C:\a\b\c'

有没有pythonic的方法来做到这一点?

4 个答案:

答案 0 :(得分:10)

请参阅os.path

from os import path
path.dirname("C:\\a\\b\\c\\d\\")

答案 1 :(得分:4)

Theres基本内容,如os.path方法。

如果你想要一个目录树中每个连续父级的完整路径名列表,那么就是一个内容:

from os.path import dirname

def f1(n): return [n] if n == dirname(n) else [n] + f1(dirname(n))

print f1("/a/b/c/d/e/f/g")

答案 2 :(得分:2)

os.path.split("C:\\a\\b\\c")将返回一个元组:

('C:\a\b', 'c')

您可以继续在元组的第一个元素上调用split。

答案 3 :(得分:2)

>>> def go_up(path, n):
...     return os.path.abspath(os.path.join(*([path] + ['..']*n)))
>>> path = 'C:\\a\\b\\c\\d\\'
>>> go_up(path, 2)
'C:\\a\\b'
>>> go_up(path, 1)
'C:\\a\\b\\c'
>>> go_up(path, 0)
'C:\\a\\b\\c\\d'

不是os.path的常规用户,我不知道这是否是一个合适的/ pythonic解决方案。我将它与备用函数进行了比较,定义如下:

def go_up_2(path, n):
    for i in xrange(n):
        path = os.path.split(path)[0]
    return path

首先要注意的是go_up_2('C:\\a\\b\\', 1) != go_up_2('c:\\a\\b', 1),它与原始go_up的位置相同。但是,性能明显更好,如果这是一个问题(可能不是,但我正在寻找一些明确的方式来说我自己的算法更好):

import timeit

g1 = """import os.path
import ntpath
os.path = ntpath
def go_up(path, n):
    return os.path.abspath(os.path.join(*([path] + ['..']*n)))"""

g2 = """import os.path
import ntpath
os.path = ntpath
def go_up(path, n):
    for i in xrange(n-1):
        path = os.path.split(path)[0]
    return path"""

t1 = timeit.Timer("go_up('C:\\a\\b\\c\\d', 3)", setup=g1).timeit()
t2 = timeit.Timer("go_up('C:\\a\\b\\c\\d', 3)", setup=g2).timeit()

print t1
print t2

此输出(在我的机器上):

133.364659071
30.101334095

不是非常有用的信息,但我一直在玩,并认为它应该在这里发布。