[英]How to check if a path is absolute path or relative path in a cross-platform way with Python?
UNIX 绝对路径以“/”开头,而 Windows 以字母“C:”或“\”开头。 python 是否有标准的 function 来检查路径是绝对路径还是相对路径?
如果路径是绝对路径, os.path.isabs
返回True
,否则返回False
。 文档说它可以在 Windows 中运行(我可以亲自确认它在 Linux 中运行)。
os.path.isabs(my_path)
如果您真正想要的是绝对路径,请不要费心检查它是否是,只需获取abspath
:
import os
print os.path.abspath('.')
从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:/')
使用os.path.isabs
。
import os.path
os.path.isabs('/home/user')
True
os.path.isabs('user')
False
实际上,我认为以上答案都没有解决真正的问题:跨平台路径。 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
os.path
模块将满足您的所有需求。
@Zbyl 在DOS下,由于当前不同目录的结果路径不会改变,因此可以说是绝对路径。 我说可以说是因为生成的路径确实相对于当前驱动器发生了变化!
这是 DOS 遗留下来的,每个驱动器都有不同的当前目录。
通过选择不同的当前驱动器,您可以隐式更改当前目录。 例如,我刚刚做了“CD”(DOS 等同于 pwd)
* CD
C:\Windows\System32
然后更改当前驱动器:
* t:
T:\
如果出乎意料,这是正确的。 因为我不记得 26 个当前目录,所以我从不使用它。
另请注意,CD 已“损坏”:
T:\ * cd c:\Windows
T:\
当前目录(在 t: 上)没有改变,但在 C: 上改变了:我们只需更改当前驱动器即可看到:
T:\ * c:
c:\Windows *
我总是使用 pushd 来更改驱动器和目录:
T:\ * pushd c:\Windows\assembly
c:\Windows\assembly *
由于网络共享没有卷,因此没有设置当前目录的明显方法。 Pushd知道怎么做。 如果你做类似的事情
pushd \\myhost\myshare\folder
DOS/Windows 将共享映射到最后一个可用的驱动器号,通常是 Z。然后切换到您指定的文件夹。 这对于需要在当前目录设置为批处理文件位置的情况下运行的批处理文件尤其重要。 为此,我开始使用许多批处理文件:
SETLOCAL EnableExtensions
pushd "%~dp0"
SETLOCAL 确保新映射的卷在批处理文件末尾未映射。 否则你会很快用完卷字母
os
或pathlib
库。 使用os
>>> from os.path import isabs
>>> isabc("./")
False
>>> isabc("C:/")
True
使用pathlib
>>> from pathlib import Path
>>> Path("./").is_absolute()
False
>>> Path("C:/").is_absolute()
True
但正如@Shoham 在他的回答中所说的https://stackoverflow.com/a/41846670/14475596
实际上,我认为以上答案都没有解决真正的问题:跨平台路径。 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
另一种方式,如果你不在当前的工作目录中,有点脏,但它对我有用。
import re
path = 'my/relative/path'
# path = '..my/relative/path'
# path = './my/relative/path'
pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.