Абсолютный путь UNIX начинается с '/', тогда как Windows начинается с алфавита 'C:' или '\'. Есть ли у python стандартная функция для проверки абсолютного или относительного пути?
Ответы:
os.path.isabs
возвращается, True
если путь абсолютный, False
если нет. В документации говорится, что он работает в Windows (я лично могу подтвердить, что он работает в Linux).
os.path.isabs(my_path)
И если вам действительно нужен абсолютный путь, не пытайтесь проверить, есть ли он, просто получите abspath
:
import os
print os.path.abspath('.')
Используйте os.path.isabs
.
Из 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:/')
Path('\tmp').is_absolute()
дает правильно False
, а os.path.isabs('\tmp')
дает неправильно True
. (Некоторые утверждают, что \tmp
это абсолютный путь в Windows, но это верно только для очень бесполезного определения абсолютного пути .)
import os.path
os.path.isabs('/home/user')
True
os.path.isabs('user')
False
На самом деле я думаю, что ни один из приведенных выше ответов не касался реальной проблемы: кроссплатформенных путей. Что делает os.path, так это загружает зависимую от ОС версию библиотеки path. поэтому решение состоит в том, чтобы явно загрузить соответствующую библиотеку путей (ОС):
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
def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
другой способ, если вы не в текущем рабочем каталоге, немного грязный, но он работает для меня.
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
переменной
os.path.isabs('c:\\')
возвращает False.