Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何转换路径格式以使用它们,无论它们来自哪个平台或模块?_Python_Path_Format - Fatal编程技术网

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版本。