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

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

83705 次浏览

如果路径是绝对值,则 os.path.isabs返回 True; 如果不是,则返回 False文件说它可以在 Windows 中工作(我个人可以确认它可以在 Linux 中工作)。

os.path.isabs(my_path)
import os.path


os.path.isabs('/home/user')
True


os.path.isabs('user')
False

如果你的 真的很想是绝对路径,不用检查它是不是绝对路径,只要得到 abspath:

import os


print os.path.abspath('.')

实际上,我认为以上的答案都没有解决真正的问题: 跨平台路径。Path 所做的是加载与操作系统相关的“ 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)

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:/')

在 DOS 下,由于生成的路径不会因为不同的当前目录而改变,所以可以说它是一个绝对路径。我之所以这样说,是因为结果路径确实相对于当前驱动器发生了变化!

这是 DOS 的剩余部分,每个驱动器有不同的工作目录。

通过选择一个不同的 当前驱动器,你隐含地改变了工作目录。例如,我刚刚做了“ CD”(pwd 的 DOS 等值)

* 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 确保在批处理文件的末尾取消映射新映射的卷。否则,你很快就会用完所有的大写字母

您可以使用 ospathlib库。

使用 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 在他的回答中所说
实际上,我认为以上的答案都没有解决真正的问题: 跨平台路径。Path 所做的是加载与操作系统相关的“ 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