如何使用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以跨平台方式检查路径是绝对路径还是相对路径?的主要内容,如果未能解决你的问题,请参考以下文章