2017-07-09 58 views
3

這個問題其實很簡單,但我想知道是否有一種特別優雅的方式可以解決它,我忽略了它。從路徑剝離文件名(但僅當路徑指向文件時)

考慮我得到一個可以指向目錄或文件的路徑(例如從用戶通過控制檯輸入),例如,以下

/directory1/directory2/file.txt 
/directory1/directory2 

現在我想寫除掉從路徑結束一個潛在的文件名代碼之一,但目錄名,所以,在例如兩個路徑將減少到/directory1/directory2

  • 我認爲os.path.dirname,但始終除掉最後一個路徑組件,即使它是一個目錄
  • 顯而易見的解決方案是使用os.path.isdiros.path.isfile和鋼帶有條件
  • 我想知道:是否有更短的版本可用,如os.path.closest_dirname
    什麼可能的錯誤我這裏有點是os.path.dirname返回最接近的目錄,而是將始終返回上一級目錄(即作品更像os.path.parentdir
+0

是保證有一個'.format'在文件名結束? – PYA

+0

[This answer](https://stackoverflow.com/questions/7781545/how-to-get-all-folder-only-in-a-given-path-in-python)可能有幫助 –

+1

@Prith:不,我只是爲了清楚而添加它(所以很明顯它意味着一個文件)。我認爲只有在查看名稱時模糊纔是'os.path.dirname'的原因,因爲它的確如此...... –

回答

2

os.path中沒有什麼東西可以直接做你正在尋找的東西。

我看不出有什麼太大毛病,雖然以下幾點:

print(path if os.path.isdir(path) else os.path.dirname(path)) 
+0

它並沒有真正解決這個問題,但它畢竟是最簡單的選擇,即使對於我來說,在問題中可能看起來有點不雅。如果這就是Python的設計方式,我們可能不得不忍受它... –

0

可以使用pathlib模塊,作爲替代到os.path

In [1644]: from pathlib import Path 

In [1645]: def foo(path): 
     ...:  p = Path(path) 
     ...:  return str(p.parents[0]) if p.is_file() else str(p) 
     ...: 

In [1646]: foo('/Users/coldspeed/Desktop/test.txt') 
Out[1646]: '/Users/coldspeed/Desktop' 

In [1647]: foo('/Users/coldspeed/Desktop') 
Out[1647]: '/Users/coldspeed/Desktop' 

這適用於有效的文件路徑只有。

+1

我在這裏看不到'pathlib'的必要性,因爲您仍然需要檢查路徑是一個文件或一個目錄。另外,如果你打算在目錄中使用尾部斜線,'os.path.split(...)[0]'都已經完成了。 –

+0

@MosesKoledoye它的工作方式也沒有結尾的斜線。 –

0

我會用parts而不是parents

from pathlib import Path 

def foo(path): 
    p = Path(path) 
    return p.parts[-1] # returns last part of path which is stripped filename