2013-05-02 163 views
32

我傾向於只使用正斜槓('/'),並且Python在Windows上也很滿意。 在os.path.join的描述中,它說如果你想要跨平臺的話,這是正確的方法。但是當我使用它時,我得到了混合斜槓:與windows上的os.path.join混合斜槓

import os 

a = 'c:/' 
b = 'myFirstDirectory/' 
c = 'mySecondDirectory' 
d = 'myThirdDirectory' 
e = 'myExecutable.exe' 


print os.path.join(a, b, c, d, e) 

# Result: 
c:/myFirstDirectory/mySecondDirectory\myThirdDirectory\myExecutable.exe 

這是正確的嗎?我應該檢查並糾正之後還是有更好的辦法?

感謝

編輯: 要求路徑

import sys 
for item in sys.path: 
    print item 

# Result: 
C:\Program Files\Autodesk\Maya2013.5\bin 
C:\Program Files\Autodesk\Maya2013.5\mentalray\scripts\AETemplates 
C:\Program Files\Autodesk\Maya2013.5\Python 
C:\Program Files\Autodesk\Maya2013.5\Python\lib\site-packages 
C:\Program Files\Autodesk\Maya2013.5\bin\python26.zip\lib-tk 
C:/Users/nookie/Documents/maya/2013.5-x64/prefs/scripts 
C:/Users/nookie/Documents/maya/2013.5-x64/scripts 
C:/Users/nookie/Documents/maya/scripts 
C:\Program Files\Nuke7.0v4\lib\site-packages 
C:\Program Files\Nuke7.0v4/plugins/modules 
+0

'os'是聰明的,它可以削減你的操作系統所需的大小。要正確使用它,不要在你的字符串a,b,c,d和e-os中加入斜線。 – ejrb 2013-05-02 08:40:19

+1

我明白了,但如果我在尋找路徑時遇到混合斜線,該怎麼辦? (我已經用一個例子更新了第一篇文章) – nookie 2013-05-02 08:46:33

+2

你可以使用'os.path.normpath(mixed_slashes_path)'並獲得正常化的斜線。哦,我猜你正在Maya裏面做這件事。它非常類似於UNIX,因此在它爲您添加的路徑中存在大量斜槓。 – 2015-07-28 20:07:10

回答

18

您現在正在自己提供一些斜槓並讓os.path.join選取其他人。讓python選擇所有這些或自己提供它們會更好。 Python在路徑的後半部分使用反斜槓,因爲反斜槓是Windows的默認設置。

import os 

a = 'c:' # removed slash 
b = 'myFirstDirectory' # removed slash 
c = 'mySecondDirectory' 
d = 'myThirdDirectory' 
e = 'myExecutable.exe' 

print os.path.join(a + os.sep, b, c, d, e) 

我還沒有測試過這個,但我希望這有助於。擁有基本路徑並且只需要連接另一個元素(主要是文件)更爲常見。

順便說一下;你可以使用os.sep那些你想擁有python運行的操作系統的最佳分隔符的時刻。

編輯:作爲破折號轟隆隆的狀態,顯然對於Windows,你需要包括一個路徑根分隔符。否則,您將創建一個相對路徑而不是絕對路徑。

+0

感謝您的回答,但如果我在一個字符串中得到斜槓(當有兩個或多個文件夾時)會怎麼樣?我用sys.path得到的一些路徑更新了第一篇文章 – nookie 2013-05-02 08:57:01

+0

這取決於路徑來自哪裏。但大多數情況下,您應該已經擁有正確格式的斜線。也就是說,如果你通過Python獲得路徑。 如果您有一些您無法控制的外部源,並且該源提供了正斜槓而不是反斜槓;你可能想先解決這個問題。 – pyrocumulus 2013-05-02 09:02:35

+0

所以我應該檢查後面的字符串,並確保格式正確? – nookie 2013-05-02 09:09:52

2

os增加了斜線你,當我還獲得混合斜槓,並確保不重複斜線所以忽略它們在你的字符串

import os 

# Don't add your own slashes 
a = 'C:' 
b = 'myFirstDirectory' 
c = 'mySecondDirectory' 
d = 'myThirdDirectory' 
e = 'myExecutable.exe' 

print os.path.join(a, b, c, d, e) 
C:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe 

附加:

我不能確定,爲什麼你已經在你的SYS路徑混合斜槓(你使用Linux操作系統添加一些文件夾?),但嘗試檢查

print os.path.isdir(os.path.join('C:','Users','nookie'))

如果這是True那麼os適用於您的混合斜線。

無論哪種方式,我會避免硬編碼目錄名稱到您的程序。你的sys.path for循環是一個安全的方式來拉出這些目錄。然後你可以使用一些字符串方法,或正則表達式來選擇所需的文件夾。

+0

os.path.isdir('C:','Users','nookie'))返回False。 我沒有使用任何Linux操作系統來添加我的文件夾,那些只是從軟件安裝! – nookie 2013-05-02 09:08:52

+1

您使用的是什麼版本的Python,@ejrb?因爲在我的,我沒有得到第一個斜線。 (我看到'C:myFirstDirectory \ mySecondDirectory ...') – 2015-05-19 02:11:34

22

可以path.join()後使用.replace(),以確保斜線是正確的:

# .replace() all backslashes with forwardslashes 
print os.path.join(a, b, c, d, e).replace("\\","/") 

這使輸出:

c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe 

由於@sharpcloud建議,這將是較好的去除從斜線你的輸入字符串,但是這是一個選擇。

+4

只需導入posixpath而不是os.path,然後執行'posixpath.join(a,b,c,d,e)',它總是會給你正斜槓。 – semicolon 2014-10-14 20:56:39

+0

@ semicolon,是不是posixpath與導入os.path相同?無論如何,在我的Windows機器上,posixpath.join()仍然返回混合斜線。 – Maximus 2014-10-16 06:48:25

+0

如果你看[這裏](https://docs.python.org/2/library/os.path.html),os.path會根據你的操作系統導入posixpath,ntpath,macpath或os2emxpath之一。我很驚訝你仍然與posixpath混合斜線。我只是在一臺windows機器上測試它,'os.path.join('foo','bar')'給了我一個\\ b''和'posixpath.join('foo','bar')'給了我'a/b'。 – semicolon 2014-10-16 20:11:07

1
  • 首先,將路徑轉換爲文件夾和文件名的數組。
  • 其次,使用正確的符號將它們粘合在一起。

    import os 
    path = 'c:\www\app\my/folder/file.php' 
    # split the path to parts by either slash symbol: 
    path = re.compile(r"[\/]").split(path) 
    # join the path using the correct slash symbol: 
    path = os.path.join(*path) 
    
+3

請注意,如果您的字符串碰巧使用'\'來轉義文件夾內的空格,此方法將會中斷。例如''/ usr/my \ files''會轉換爲''usr「,」my「,」files「'而不是''usr」,「我的文件」 – oriadam 2016-07-17 10:47:48

4

嘗試使用ABSPATH(使用python 3)

import os 

a = 'c:/' 
b = 'myFirstDirectory/' 
c = 'mySecondDirectory' 
d = 'myThirdDirectory' 
e = 'myExecutable.exe' 


print(os.path.abspath(os.path.join(a, b, c, d, e))) 

OUTPUT:

C:\ myFirstDirectory \ mySecondDirectory \ myThirdDirectory \ myExecutable.exe

與完成過程退出代碼0

0

如果出於任何原因,你需要自己提供的路徑和你使用上面的Python 3.4什麼,你可以使用pathlib

from pathlib import Path, PurePosixPath 

a = PurePosixPath('c:/') 
b = PurePosixPath('myFirstDirectory/') 
c = 'mySecondDirectory' 
d = 'myThirdDirectory' 
e = 'myExecutable.exe' 

print(a/b/c/d/e) 

# Result 
c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe 

我用這個當我需要一個用戶提供的資產目錄的位置和我的代碼正在查找使用Windows路徑字符串

In [1]: from pathlib import Path, PureWindowsPath 
In [2]: USER_ASSETS_DIR = Path('/asset/dir') # user provides this form environment variable 
In [3]: SPECIFIC_ASSET = PureWindowsPath('some\\asset') 
In [4]: USER_ASSETS_DIR/SPECIFIC_ASSET 

Out[4]: PosixPath('/asset/dir/some/asset')