2012-11-19 61 views
5

我正在用Python編寫一個用於Windows的命令行目錄導航器,並且用os.path.join掙扎了一下。這裏,在本質上,我想要做的事:os.path.join格式不正確的路徑

abspath = "C:\Python32\Projects\ls.py" 
abspath = abspath.split('\\') 
print(abspath) #this prints ['C:', 'Python32', 'Projects', 'ls.py'] 

if(options.mFlag): 
     print(os.path.join(*abspath)) #this prints C:Python32\Projects\ls.py 
     m = time.ctime(os.path.getmtime(os.path.join(*abspath))) #this throws an exception 

的問題是,os.path.join是不是後面插入「/」「C:」,我想不通爲什麼。任何幫助?

編輯:如果將來有人來這裏尋找解決方案,我只是在「C:」之後添加了os.sep,而不是硬編碼反斜槓,並且工作正常。

回答

6

the documentation

注意,在Windows中,由於存在用於每個驅動器的當前目錄,os.path.join("c:", "foo")表示其路徑相對當前目錄驅動器C:(C:富),不C:\ FOO。

有點難以分辨你想要完成什麼,因爲你所有的代碼似乎都是針對分割路徑,然後把它整合到一起,在這種情況下爲什麼首先將它分開?但也許os.path.splitdrive會幫助你?它將路徑中的驅動器號分開。

+0

該塊的重點是使程序平臺獨立。在插入此函數之前,OSX中的代碼未正確執行。謝謝你的提示,我會嘗試分裂驅動。 – bkaiser

+0

@benjaminhkaiser:你可以做的另一件事是使用'/'作爲路徑分隔符而不是\。這仍然可以在Windows上運行,但也可以在其他平臺上運行。 – BrenBarn

+0

那麼我們如何才能正確地添加斜槓呢? 'os.path.join(os.getenv(「SystemDrive」),'somepath')'==''C:somepath'' – endolith

3

的文檔(http://docs.python.org/2/library/os.path.html)指定此行爲:

需要注意的是在Windows上,因爲對於每個驅動器的當前目錄,os.path.join( 「C:」, 「富」)代表相對於驅動器C上當前目錄的路徑:(c:foo),而不是c:\ foo。

+1

有沒有一個簡單的修復方法,或者我應該手動將反斜槓(或只是插入os.sep)?我只是覺得這會挫敗使用os.path.join的目的。 – bkaiser

+0

可能的解決方案不是手動分割路徑,而是使用'os.path.split'。這將正確地從驅動器號和根目錄之間刪除第一個'\'。 – Blckknght

+0

@benjaminhkaiser:你想做什麼? – BrenBarn