代码之家  ›  专栏  ›  技术社区  ›  ymmx

如何转换路径格式以使用它们,无论它们来自哪个平台或模块?

  •  0
  • ymmx  · 技术社区  · 7 年前

    我正在使用

    abspath = os.path.dirname(os.path.abspath(__file__))
    

    要获取当前scipt的文件夹,请执行以下操作:

    'C:\\Users\\Me\\PycharmProjects\\Model_HIPP_ATN_Reu'
    

    那么我用的是 QFileDialog 要获取保存文件路径,请执行以下操作:

    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('/','\\') 因为这只适用于窗户,对吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   bruno desthuilliers    7 年前

    首先要知道的是: os.path 是系统特定 path 模块,但您仍然可以通过名称访问其他系统路径模块,即 import ntpath, posixpath, macpath (但我怀疑您是否需要macpath—这是OSX之前的path系统)。您可以使用它来测试从一个系统切换到另一个系统时发生的情况。

    此外,“/”是Windows的有效路径sep,并作为 ntpath.altsep (当 posixpath.altsep macpath.altsep None ),和 ntpath 知道如何处理两个分隔符,因此实际上不必对 abspath 使用前 os.path.relpath() :

    >>> import ntpath
    >>> abspath = "C:\\Users\\Me\\PycharmProjects\\Model_HIPP_ATN_Reu"
    >>> savefile= 'C:/Users/Me/PycharmProjects/Model_HIPP_ATN_Reu/PopsManager_auto/Model.py'
    >>> relative = ntpath.relpath(savefile, abspath)
    >>> relative 
    'PopsManager_auto\\Model.py'
    

    此时,我注意到,对于相对路径,我没有得到与您相同的结果(我使用py2.7.x和py3.4.3获得上述结果-这里没有安装py3.6.x)。您实际使用的确切python版本是什么?

    现在,如果要“规范化”相对路径,只需测试当前 os.path.altsep 价值是,如果不是 没有一个 ,将其用于替换:

    >>> # 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'