【问题标题】:How to check if a path is absolute path or relative path in a cross-platform way with Python?如何使用Python以跨平台方式检查路径是绝对路径还是相对路径?
【发布时间】:2011-03-20 05:21:18
【问题描述】:

UNIX 绝对路径以“/”开头,而 Windows 以字母“C:”或“\”开头。 python是否有标准函数来检查路径是绝对路径还是相对路径?

【问题讨论】:

    标签: python path


    【解决方案1】:

    os.path.isabs 如果路径是绝对路径,则返回 True,否则返回 FalseThe documentation 说它可以在 Windows 中运行(我可以确认它在 Linux 中运行)。

    os.path.isabs(my_path)
    

    【讨论】:

    • 这个功能不是跨平台的。在 Unix 上 os.path.isabs('c:\\') 返回 False。
    • Rotfl,它应该返回 False,因为 C:\\ 不是 Unix 系统中的绝对路径。 unix 平台上的绝对路径以“/”开头,例如“/var/custApp/”等:)
    • @techtonik 为了让其他可能发现此内容的人完全清楚:`c:\` 是 unix 中完全有效的文件/目录名称。因此,它实际上是 Unix 系统上的相对路径。因此,该功能是跨平台的。因为,它考虑到了 Windows 和 Unix 的特点。
    • 没错。它在不同平台上的行为不一样,它给出了当前平台的正确答案。
    • 不回答问题。要让跨平台规则使用 'ntpath' 或 'posixpath' 而不是 'os.path'
    【解决方案2】:

    如果您真正想要的是绝对路径,请不要费心检查它是否是,只需获取abspath

    import os
    
    print os.path.abspath('.')
    

    【讨论】:

    • 它可能没有回答最初的问题,但正是我在没有意识到的情况下寻找的。谢谢!
    【解决方案3】:

    来自python 3.4 pathlib 可用。

    In [1]: from pathlib import Path
    
    In [2]: Path('..').is_absolute()
    Out[2]: False
    
    In [3]: Path('C:/').is_absolute()
    Out[3]: True
    
    In [4]: Path('..').resolve()
    Out[4]: WindowsPath('C:/the/complete/path')
    
    In [5]: Path('C:/').resolve()
    Out[5]: WindowsPath('C:/')
    

    【讨论】:

    • 这个答案实际上适用于 Windows..Path('\tmp').is_absolute() 正确给出了 False,而 os.path.isabs('\tmp') 给出了错误的 True。 (有些人会争辩说\tmp 是 Windows 上的绝对路径,但这仅适用于绝对路径的非常无用的定义。)
    • 很奇怪。 Path('C:/').is_absolute() 为我返回 False:Python 3.6.9(默认,2020 年 7 月 17 日,12:50:27)>>> from pathlib import Path >>> Path('..' ).is_absolute() False >>> Path('C:/').is_absolute() False >>>
    【解决方案4】:

    使用os.path.isabs

    【讨论】:

      【解决方案5】:
      import os.path
      
      os.path.isabs('/home/user')
      True
      
      os.path.isabs('user')
      False
      

      【讨论】:

      • 我不认为反斜杠会起作用,至少它不会在我的 linux 机器上。
      【解决方案6】:

      实际上,我认为以上答案都没有解决真正的问题:跨平台路径。 os.path 所做的是加载依赖于操作系统的“路径”库版本。所以解决方案是显式加载相关(OS)路径库:

      import ntpath
      import posixpath
      
      ntpath.isabs("Z:/a/b/c../../H/I/J.txt")
          True
      posixpath.isabs("Z:/a/b/c../../H/I/J.txt")
          False
      

      【讨论】:

      • 是的!该问题特别提到了windows和linux路径!一种适用于几乎所有设置的快速单线:def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
      【解决方案7】:

      如果您不在当前工作目录中,另一种方式,有点脏但对我有用。

      import re
      path = 'my/relative/path'
      # path = '..my/relative/path'
      # path = './my/relative/path'
      
      pattern = r'([a-zA-Z0-9]|[.])+/'
      is_ralative = bool(pattern)
      

      【讨论】:

      • 您的代码实际上并没有将模式用于任何事情或对path 变量做任何事情
      猜你喜欢
      • 2011-11-25
      • 2014-03-09
      • 2011-10-16
      • 1970-01-01
      • 2015-11-13
      • 2019-09-09
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      相关资源
      最近更新 更多