python-在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

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

谢谢

编辑:在询问路径时我也会得到斜杠

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
nookie asked 2020-01-12T07:56:59Z


您可以在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所建议的,最好从输入字符串中删除斜杠,但这是另一种选择。


现在,您自己提供一些斜线,让os.sep选择其他斜线。 最好让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)

我尚未对此进行测试,但希望对您有所帮助。 具有基本路径并且只需要联接另一个元素(通常是文件)是更常见的。

顺便说说; 您可以在需要运行python操作系统的最佳分隔符的那一刻使用os.sep。

编辑:如dash-tom-bang所示,显然对于Windows,您确实需要包括路径根的分隔符。 否则,您将创建相对路径,而不是绝对路径。


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

输出:

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

流程结束,退出代码为0


根据评论编辑: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)

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

首先,将路径转换为文件夹和文件名的数组。

其次,使用正确的符号将它们重新粘合在一起。

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)


sys.path为您添加斜杠,并确保不要重复斜杠,因此请在字符串中省略它们

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 os添加一些文件夹?),但尝试检查一下

sys.path。

如果这是sys.path,则os适用于混合斜杠。

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


如果出于任何原因需要自己提供路径,并且使用了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')