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

noo*_*kie 52 python windows path

我倾向于只对路径使用正斜杠('/'),而python也对它在窗口上也很满意.在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
Run Code Online (Sandbox Code Playgroud)

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

谢谢

编辑:当我要求路径时,我也会得到混合斜杠

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
Run Code Online (Sandbox Code Playgroud)

Max*_*mus 37

您可以使用.replace()after path.join()来确保斜杠是正确的:

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

这给出了输出:

c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe
Run Code Online (Sandbox Code Playgroud)

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

  • 最好只导入posixpath而不是os.path然后执行`posixpath.join(a,b,c,d,e)`这将始终为您提供正斜杠. (6认同)

pyr*_*lus 30

你现在提供一些自己的斜杠,并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)
Run Code Online (Sandbox Code Playgroud)

我没有测试过这个,但我希望这会有所帮助.拥有基本路径并且只需要加入另一个元素(主要是文件)更为常见.

顺便说说; 你可以使用os.sep那些想要拥有python正在运行的操作系统的最佳分隔符的时刻.

编辑:作为dash-tom-bang状态,显然对于Windows,您需要为路径的根目录包含一个分隔符.否则,您将创建相对路径而不是绝对路径.


And*_*aal 10

尝试使用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)))
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

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

进程以退出代码0结束

  • `os.path.abspath()` 首先调用 `os.path.normpath()`。您可以在这里实现相同的功能,只需调用`os.path.normpath()`。 (5认同)

ori*_*dam 8

根据评论编辑: path = os.path.normpath(path)

我以前的答案缺乏处理转义字符的能力,因此不应该使用:

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

    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)
    
    Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您的字符串碰巧使用`\`来转义文件夹中的空格,则此方法将会中断.例如``/ usr/my\files``将翻译成`"usr","my","files"`而不是"usr","我的文件"` (3认同)
  • 不要重新发明轮子。只需使用`os.path.normpath()`。 (3认同)

din*_*ltz 5

如果出于任何原因您需要自己提供路径并且您使用了 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
Run Code Online (Sandbox Code Playgroud)

当我需要用户提供资产目录的位置并且我的代码正在使用 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')
Run Code Online (Sandbox Code Playgroud)