Python 如何转换路径格式以使用它们,无论它们来自哪个平台或模块?
我正在使用Python 如何转换路径格式以使用它们,无论它们来自哪个平台或模块?,python,path,format,Python,Path,Format,我正在使用 abspath = os.path.dirname(os.path.abspath(__file__)) 要获取当前scipt的文件夹,请执行以下操作: 'C:\\Users\\Me\\PycharmProjects\\Model_HIPP_ATN_Reu' savefile : 'C:/Users/Me/PycharmProjects/Model_HIPP_ATN_Reu/PopsManager_auto/Model.py' 然后,我使用QFileDialog获取一个保存文件
abspath = os.path.dirname(os.path.abspath(__file__))
要获取当前scipt的文件夹,请执行以下操作:
'C:\\Users\\Me\\PycharmProjects\\Model_HIPP_ATN_Reu'
savefile : 'C:/Users/Me/PycharmProjects/Model_HIPP_ATN_Reu/PopsManager_auto/Model.py'
然后,我使用QFileDialog
获取一个保存文件路径,该路径为:
'C:\\Users\\Me\\PycharmProjects\\Model_HIPP_ATN_Reu'
savefile : 'C:/Users/Me/PycharmProjects/Model_HIPP_ATN_Reu/PopsManager_auto/Model.py'
我想用path.relpath
查找这两条路径之间的相对路径,如下所示:
savefile=savefile.replace('/','\\')
os.path.relpath(savefile,abspath)
这为我提供了正确的文件夹路径:
'PopsManager_auto/Model.py'
但我的问题是,如果我在不同的系统上获取了savefile或abspath,那么这段代码将无法工作,因为路径格式不同。无论平台如何,路径的获取方式如何(例如Qt或Os模块),我如何能拥有相同格式的路径?我不想使用
.replace(“/”、“\\”)
,因为这只在窗口上工作,对吗?首先要知道:os.path
是系统特定路径
模块的快捷方式,但您仍然可以通过名称访问其他系统路径模块,即导入ntpath、posixpath、macpath
(但我怀疑你是否需要macpath——它是OSX之前的path系统)。你可以用它来测试从一个系统切换到另一个系统时会发生什么
另外,“/”是Windows的有效路径sep,其存在形式为ntpath.altsep
(而posixpath.altsep
和macpath.altsep
为None
),并且ntpath
知道如何处理这两个分隔符,因此在使用os.path.relpath()之前,实际上不必对abspath
进行任何替换:
在这一点上,我注意到对于相对路径,我没有得到与您相同的结果(我使用py2.7.x和py3.4.3获得上述结果-我没有在这里安装py3.6.x)。您实际使用的python版本是什么
现在,如果要“规范化”相对路径,只需测试当前的os.path.altsep
值是什么,如果不是None
,则将其用于替换:
>>> # Q&D hack to use `ntpath` as `os.path` on a posix system
>>> import os, ntpath; os.path = ntpath
>>> # now pretend we're on a nt system
>>> if os.path.altsep:
... relative = relative.replace(os.path.sep, os.path.altsep)
...
>>> relative
'PopsManager_auto/Model.py'
现在,您有了一个对posixpath
和ntpath
都有效的相对路径
当从该相对路径和根目录路径重建绝对路径时,您所要做的就是将os.path.normpath()
应用于根路径和相对路径,然后将os.path.join()应用于它们:
>>> relative
'PopsManager_auto/Model.py'
>>> os.path.normpath(relative)
'PopsManager_auto\\Model.py'
>>> root = "C:\\Users\\Me\\PycharmProjects\\Model_HIPP_ATN_Reu"
>>> relative = os.path.normpath(relative)
>>> relative
'PopsManager_auto\\Model.py'
>>> os.path.join(root, relative)
'C:\\Users\\Me\\PycharmProjects\\Model_HIPP_ATN_Reu\\PopsManager_auto\\Model.py'
好的,我明白了。我甚至没有用mixed/and\\\测试path.repath。事实上,这是可行的。所以我的缺点是。os.path.normpath会起作用,所以无论我加载文件的平台是什么,我都能够将相对路径转换到该平台。所以非常感谢。顺便说一句,我使用的是python的3.6.1版本。