2011-08-21 98 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,但我不能對他的回答評論因爲我還沒有足夠的聲譽。 :)