在windows上使用os.path.join混合斜杠

我倾向于只使用正斜线('/'),python在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 

它是否正确? 我应该检查并纠正之后还是有更好的办法?

谢谢

编辑:我也得到混合斜线时要求的path

 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 

您现在正在提供一些斜线,并让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,你需要包括一个分隔符的路径的根。 否则,您将创建一个相对路径而不是绝对路径。

您可以在path.join() .replace()之后使用.replace()来确保斜线是正确的:

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

这给出了输出:

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

正如@sharpcloud建议的那样,最好从输入字符串中删除斜线,但是这是一个选择。

尝试使用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结束

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 

额外:

我不确定你为什么在你的系统路径中有混合斜杠(你有使用Linux操作系统来添加一些文件夹?),但尝试检查

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

如果这是True那么os适用于你的混合斜线。

无论哪种方式,我会避免硬编码目录名称到您的程序。 您的sys.path for循环是一个安全的方式来拉出这些目录。 然后你可以使用一些字符串方法,或正则表达式来选择所需的文件夹。

  • 首先,将路径转换为文件夹和文件名的数组。
  • 其次,使用正确的符号将它们粘在一起。

     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) 

如果由于某种原因,你需要自己提供路径,并且你已经使用了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')