解决sys.path和os.path.join中的混合斜杠
我需要解决一个问题,就是系统路径(sys.path)提供的分隔符和操作系统路径连接(os.path.join)使用的分隔符不一致。
我模仿了Esri的方法(分享Python脚本的技巧),想让我的脚本可以在不同环境中使用。目前它在Windows上运行,但最终会放在Linux服务器上;我需要让Python自动选择合适的斜杠。
他们的建议是:
# Get the pathname to this script
scriptPath = sys.path[0]
# Get the pathname to the ToolShare folder
toolSharePath = os.path.dirname(scriptPath)
# Now construct pathname to the ToolData folder
toolDataPath = os.path.join(toolSharePath, "ToolData")
print "ToolData folder: " + toolDataPath
但是这样输出的结果是 ToolData folder: C:/gis\ToolData
-- 很明显,混合使用斜杠是行不通的。
这个问题(Windows上os.path.join的混合斜杠)给出了一个解决方案的基本思路:
在把外部输入(你显然无法控制格式的输入)放入
os.path.join
之前,先检查一下。这可以确保os.path.join
不会因为可能不好的输入而做出错误的决定。
不过,我不太确定如何确保它在不同平台上都能正常工作。如果我对 sys.path[0]
的结果使用 .replace("/","\\")
,这在Windows上没问题,但一旦我转到Unix,这样做是不是又会引发同样的混合斜杠问题呢?
3 个回答
在Python中,有一个叫做os.sep
的字符,它用来存储你操作系统喜欢的文件夹分隔符。你可以用这个字符手动连接字符串,试试看?
在Linux系统上:
>>> import os
>>> os.sep
'/'
在阅读了文档并尝试了很多不同的方式之后:
os.path.abspath
这个函数可以“清理”斜杠,所以无论sys.path[0]
使用哪种方向的斜杠,都会把它们替换成你想要的那种斜杠。
scriptPath = sys.path[0]
toolDataPath = os.path.join(scriptPath, "ToolData")
结果是:C:/gis\ToolData
scriptPath = sys.path[0]
toolSharePath = os.path.abspath(scriptPath)
# or, in one line: toolSharePath = os.path.abspath(sys.path[0])
toolDataPath = os.path.join(toolSharePath, "ToolData")
结果是:C:\gis\ToolData
你可以试试用 os.path.normpath() 这个方法。
>>> import os
>>> os.path.normpath(r'c:\my/path\to/something.py')
'c:\\my\\path\\to\\something.py'
还有一点值得注意的是:在Windows系统中,路径的API并不在乎你用的是正斜杠还是反斜杠。通常是程序没有正确处理斜杠的问题。例如,在Python中:
with open(r'c:/path/to/my/file.py') as f:
print f.read()
这样写是可以正常工作的。