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

时间:2013-05-02 08:31:54

标签: python windows path

我倾向于只对路径使用正斜杠('/'),而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

9 个答案:

答案 0 :(得分:34)

您可以在.replace()之后使用path.join()以确保斜杠正确无误:

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

这给出了输出:

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

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

答案 1 :(得分:26)

您现在自己提供一些斜杠,并让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的操作系统的最佳分隔符。

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

答案 2 :(得分:9)

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

答案 3 :(得分:8)

根据评论进行编辑: ggplot(data = df, aes(x = Index, y = Value)) + geom_line(aes(group = Series, color = Series))

我之前的回答缺乏处理转义字符的功能,因此不应使用

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

    path = os.path.normpath(path)

答案 4 :(得分: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循环是一种安全的方法来提取这些目录。然后,您可以使用一些字符串方法或正则表达式来选择所需的文件夹。

答案 5 :(得分:2)

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

答案 6 :(得分:0)

您也可以这样做:

import re

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

joined = os.path.join(a, b, c, d, e)
formatted = re.sub(r'/|\\', re.escape(os.sep), joined)

这会将所有可能混合的斜杠切换为与操作系统兼容的斜杠。

我知道这是一个古老的话题,但我无法抗拒。 :)

答案 7 :(得分:0)

Postgres命令客户端psql甚至在Windows上也不接受反斜杠:

>psql -U user -h 111.111.111.111 -d mydb
psql (12.2, server 12.5 . . .
. . .
mydb=> \i C:\my\path\myscript.sql
C:: Permission denied

因此从Python 3.8.6执行时需要修复它。不想求助于天真的字符串替换并使用现有功能:

script_path = Path(script_dir).resolve()
input_sql = f'\\i {script_path.joinpath("myscript.sql").as_posix()}\n'

但是在引擎盖下有:

# ...\Programs\Python\Python38\Lib\pathlib.py
    def as_posix(self):
        """Return the string representation of the path with forward (/)
        slashes."""
        f = self._flavour
        return str(self).replace(f.sep, '/')

答案 8 :(得分:0)

我这样做的方法相当简单:rstrip 来自斜杠的所有路径,无论数量和正确性如何,使用正确的分隔符将这些路径添加回去。

import os

def join_path_regardless_of_separators(*paths):
    return os.path.sep.join(path.rstrip(r"\/") for path in paths)
 
a = 'c:/'
b = 'myFirstDirectory/'
c = 'mySecondDirectory'
d = 'myThirdDirectory\\\\\\/'
e = 'myExecutable.exe'
join_path_regardless_of_separators(a, b, c, d, e)
>>> 'c:\\myFirstDirectory\\mySecondDirectory\\myThirdDirectory\\myExecutable.exe'

使用它的另一种方法,同样的结果:

join_path_regardless_of_separators(*"""c:////\\\\
                                       myFirstDirectory/
                                       mySecondDirectory\\\\
                                       myThirdDirectory/////
                                       myExecutable.exe
                                    """.split())