如何使用Python以跨平台方式检查路径是绝对路径还是相对路径?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

os.path.isabs 如果路径是绝对路径,则返回 True,否则返回 False。 The 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 变量做任何事情

以上是关于如何使用Python以跨平台方式检查路径是绝对路径还是相对路径?的主要内容,如果未能解决你的问题,请参考以下文章

跨平台桌面目录路径?

python绝对路径和相对路径

Python的相对路径与绝对路径

Python中的绝对路径和相对路径

在Python中以绝对路径或者相对路径导入文件(或模块)的方法

python绝对路径的表述方式 及 字符串的转义