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