【发布时间】:2009-03-26 22:52:38
【问题描述】:
如何从单条路径获取上层路径?
假设你有这样的路径:
'C:\a\b\c\d\'
如何到达'C:\a\b' 或'C:\a\b\c'
有没有pythonic方法可以做到这一点?
【问题讨论】:
如何从单条路径获取上层路径?
假设你有这样的路径:
'C:\a\b\c\d\'
如何到达'C:\a\b' 或'C:\a\b\c'
有没有pythonic方法可以做到这一点?
【问题讨论】:
from os import path
path.dirname("C:\\a\\b\\c\\d\\")
【讨论】:
有一些基本的东西,比如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")
【讨论】:
os.path.split("C:\\a\\b\\c") 将返回一个元组:
('C:\a\b', 'c')
您可以继续在元组的第一个元素上调用 split。
【讨论】:
>>> 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
不是很有用的信息,但我正在玩,并认为无论如何都应该在这里发布。
【讨论】: