2010-03-11 84 views
58

我正在學習python,並且正在製作一個將輸出腳本的程序。我想使用os.path.join,但我很困惑。按照docs如果我說:Windows上的Python os.path.join

os.path.join('c:', 'sourcedir') 

我得到"C:sourcedir"。根據文檔,這是正常的,對嗎?

但是,當我使用copytree命令,Python將其輸出所需的方式,例如:

import shutil 
src = os.path.join('c:', 'src') 
dst = os.path.join('c:', 'dst') 
shutil.copytree(src, dst) 

以下是錯誤代碼,我得到:

 
WindowsError: [Error 3] The system cannot find the path specified: 'C:src/*.*' 

如果我換了os.path.joinos.path.normpath我得到同樣的錯誤。

如果這個os.path.join不能用這種方式,那麼我對它的目的感到困惑。

根據Stack Overflow建議的頁面,斜槓不應該用於連接—這是正確的,我假設?

回答

33

Windows有當前目錄下的每個驅動器的概念。因此,"c:sourcedir"在當前C:目錄中表示「sourcedir」,您需要指定絕對目錄。

所有的這些都應該工作,並給予同樣的結果,但我沒有一個Windows VM此刻仔細檢查發射了:

"c:/sourcedir" 
os.path.join("/", "c:", "sourcedir") 
os.path.join("c:/", "sourcedir") 
+3

os.path.join('C:/','sourcedir')按預期工作。 我非常感謝你的好先生:) 別人 '//' 'C:' 'C:\\' 沒有工作(C:\\創建兩個反斜槓,C:\沒有一起工作) 再次感謝ghostdog74,Smashery和Roger Pate。我在你的債務:) – 2010-03-11 06:12:22

+0

對不起,換行符不留在評論中,它看起來很雜亂 – 2010-03-11 06:12:42

3

加入Windows路徑,嘗試

mypath=os.path.join('c:\\', 'sourcedir') 

基本上,你需要躲避斜線

11

原因os.path.join('C:', 'src')像您期望的不工作是因爲在文檔中的東西,你鏈接於:

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

正如ghostdog說,你可能想mypath=os.path.join('c:\\', 'sourcedir')

10

要學究,它可能不是很好的硬編碼作爲路徑分隔符。也許這會是最好的?

mypath = os.path.join('c:%s' % os.sep, 'sourcedir') 

mypath = os.path.join('c:' + os.sep, 'sourcedir') 
73

要更加迂腐,最蟒蛇文檔一致的答案是:

mypath = os.path.join('c:', os.sep, 'sourcedir') 

因爲你還需要操作系統。sep的posix根路徑:

mypath = os.path.join(os.sep, 'usr', 'lib') 
+2

這是正確的答案。 – 2016-02-09 17:12:42

4

我會說這是一個(Windows)的Python的錯誤。

爲什麼錯誤?

我覺得這個說法應該是True

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__)) 

但它是False在Windows機器上。

+1

我傾向於同意這構成了一個Python錯誤。這仍然是這樣嗎? (從2015年末光輝的烏托邦未來開始寫作。) – 2015-12-06 05:55:57

+0

我無法回答關於windows的這個問題,因爲我無法訪問Windows機器,但我猜python在這個問題上的行爲沒有改變。 無論如何,這個聲明對於Linux實現也不是這樣,因爲第一條語句返回的路徑沒有前導分隔符(a.k.a根目錄),而第二條語句返回包含前導分隔符的路徑。 – georg 2015-12-06 15:32:47

+0

所以我其實不喜歡我對這個問題的回答。但我也不喜歡Python的這種行爲。 – georg 2015-12-06 15:39:23

0

同意用@ georg-

我會說那爲什麼我們需要跛os.path.join - 更好地使用str.joinunicode.join例如

sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep)) 
+0

是的,正確的,這是waaaaayy更清晰的方式。爲什麼不在使用正則表達式時使用正則表達式?或者調用perl腳本並處理輸出? – 2017-12-06 12:31:49

0

您有治療上的Windows路徑的幾個可能的方法,從最硬編碼的人(如使用原始字符串字面量或轉義反斜線)到最低的。這裏有幾個例子可以按預期工作。使用更適合您需求的東西。

In[1]: from os.path import join, isdir 

In[2]: from os import sep 

In[3]: isdir(join("c:", "\\", "Users")) 
Out[3]: True 

In[4]: isdir(join("c:", "/", "Users")) 
Out[4]: True 

In[5]: isdir(join("c:", sep, "Users")) 
Out[5]: True