2012-09-26 21 views
12

我正在學習Python和我發現了一些奇怪我的劇本之一。做一個小的測試中,我發現了這個問題,從這一行爲朵朵:爲什麼os.path.join拋棄參數?

>>> import os 
>>> os.path.join('a','b') 
'a/b' 
>>> os.path.join('a','/b') 
'/b' 

檢查documentation,這是,事實上,該功能的設計:

os.path中。 加入PATH1[PATH2[,... ]]

加入智能地一個或多個路徑的部件。如果任何組件是絕對路徑,則以前的所有組件(在Windows上,包括上一個驅動器盤符,如果有的話)都會被丟棄,並繼續加入。 ...

我的問題是不是why my script failed,而是爲什麼功能是這樣設計的。我的意思是,至少在Unix上,a//b是指定路徑的完全可接受的方式,如果不是優雅的話。爲什麼用這種方式設計功能?有沒有什麼辦法可以判斷一個或多個路徑元素是否已被丟棄,而不是用os.path.isabs()測試每個路徑字符串?

>>> os.path.join('a/','b') 
'a/b' 

按預期工作:


出於好奇,我也是在一個路徑組件在os.sep字符結尾檢查的情況。如果你問一個用戶輸入一個文件名,其中爲os.path.join('a', '/b')返回/b它是有用的

+0

一個容易的,雖然不雅的方法來檢查這是做'filename.lstrip('/')' – voithos

+3

@voithos使它成爲'filename.lstrip(os.sep)',它可移植到大多數主要平臺。 – delnan

+0

@delnan:你必須測試在Windows,它是'os.sep +「/」'.. –

回答

14

一種情況是。

用戶可以輸入一個相對要麼路徑添加到當前目錄或完整路徑,你的程序可以處理這兩種情況是這樣的:

os.path.join(os.getcwd(), filename) 

In [54]: os.getcwd() 
Out[54]: '/tmp' 

In [55]: os.path.join(os.getcwd(), 'foo') 
Out[55]: '/tmp/foo' 

In [56]: os.path.join(os.getcwd(), '/foo/bar') 
Out[56]: '/foo/bar' 
+1

......或其他任何目錄,如果有一個合理的默認應用程序目錄。 – delnan

+4

Guido在[第一次修訂](http://hg.python.org/cpython/file/5570dbb1ce55/Lib/posixpath.py#11)中記住了這一點(其中函數以'cat'開頭,稍後被重命名爲'join')。 –

+0

@Martijn彼得斯:這很有趣。如果Guido解釋了設計背後的目的,我會很好奇。並感謝unutbu指出一個有意義的用例。 –

1

想想你寫像cd一個實用程序,檢查新的目錄,你可以使用

os.path.join(currdir, newdir) 

如果我們呃進入/b你會除了它拋出第一個參數。這對於使用當前目錄的很多東西來說很有效。

相關問題