如何从单一路径获取上层路径?
所以说你有一条道路:
'C:\a\b\c\d\'
如何访问'C:\a\b'
或'C:\a\b\c'
有没有pythonic的方法来做到这一点?
答案 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
不是非常有用的信息,但我一直在玩,并认为它应该在这里发布。