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