2011-08-21 94 views
4

我无法找到有效的方法来完成此操作。最好的办法来形容什么,我试图做的是通过实例,所以我们去哪里(假设/酒吧/是父):检索文件路径的尾端

C:\foo\bar\baz\text.txt 

将是我的道路。我对直到路径的顶级父目录的所有内容感兴趣。我需要的是一个能够做到这一点的脚本。换句话说,我只想抓住

\bar\baz\text.txt 

斯普利特不适合我。它会分割文件和路径,但不会像这样输出。是否有我失踪的内置功能,或者我是SOL?谢谢!

回答

0
In [44]: path = 'a/b/c' 

In [45]: back = os.path.relpath('.', os.path.join(path, '..')) 

In [46]: back 
Out[46]: '..\\..' 

In [47]: tail = os.path.relpath(path, os.path.join(path, back))) 

In [48]: tail 
Out[48]: 'b\\c' 

Aka不,我不知道。

0

我会保持简单。都转换CWD和你的输入路径到绝对路径,然后只用startswith和切片

path = os.path.abspath(path) 
#Make sure you finish curDir with a path separator 
#to avoid incorrect partial matches 
curDir = os.path.abspath(".") + os.path.sep 
if path.startswith(curDir): 
    whatYouWant = path[len(curDir) - 1:] 
1

你总是可以使用string.split()

>>> print '\\' + path.split('\\', 2)[-1] 
\bar\baz\text.txt 
1

我不知道你是什么意思时,你说“顶级父目录“。您的顶级目录是C:\。什么家长?如果你想获得与当前工作目录的父目录开始的相对路径,试试这个:

import os.path 
os.path.relpath("C:\\foo\\bar\\baz\\text.txt", os.path.dirname(os.path.realpath('..'))) 
1

不知道你想要什么,但你可以使用鲜为人知rsplit ,它从字符串的右侧分开。

>>> filepath = r"C:\foo\bar\baz\text.txt" 
>>> directories_deep = 3 
>>> os.path.sep.join(filepath.rsplit(os.path.sep, directories_deep)[-directories_deep:]) 
'bar\\baz\\text.txt' 
0

以下是我解决了这个问题:

def gettail(path_, length):   
    elements = [] 
    for i in range(length): 
     s = os.path.split(path_) 
     elements.append(s[1]) 
     path_ = s[0] 

    outpath = elements.pop() 
    while elements: 
     outpath = os.path.join(outpath, elements.pop()) 
    return outpath 

输出:

>>> print gettail(r"C:\foo\bar\baz\text.txt", 3) 
    'bar\\baz\\text.txt' 

建议/改进的欢迎。

1

我创建了一个辅助函数,没有工作:

import os 
def get_path_tail(path, tail_length = 1): 
    assert isinstance(tail_length, int) 
    if tail_length == 1: 
     return path.split('/')[-tail_length] 
    elif tail_length > 1: 
     return os.path.join(*path.split('/')[-tail_length:]) 

行为:

>>> path = os.path.join('C:','foo','bar', 'baz','text.txt') 
>>> print get_path_tail(path, tail_length = 3) 

    bar/baz/text.txt 

它的签名是像在ForeverWintranswer,但我不能对他的回答评论因为我还没有足够的声誉。 :)