Как проверить, является ли путь абсолютным или относительным путем кросс-платформенного способа с Python?

147

Абсолютный путь UNIX начинается с '/', тогда как Windows начинается с алфавита 'C:' или '\'. Есть ли у python стандартная функция для проверки абсолютного или относительного пути?

просек
источник

Ответы:

213

os.path.isabsвозвращается, Trueесли путь абсолютный, Falseесли нет. В документации говорится, что он работает в Windows (я лично могу подтвердить, что он работает в Linux).

os.path.isabs(my_path)
Дональд Майнер
источник
1
Эта функция не является кроссплатформенной. В Unix os.path.isabs('c:\\')возвращает False.
анатолий техтоник
69
Rotfl, и он должен вернуть False, поскольку C: \\ не является абсолютным путем в системе Unix. Абсолютные пути на платформах unix начинаются с «/», например «/ var / custApp /» и т. Д. :)
Марек Левандовски
30
@techtonik Чтобы сделать это совершенно ясным для всех, кто может это найти: `c: \` - это совершенно правильное имя файла / каталога в unix. Итак, это действительно был бы относительный путь в системе unix. Следовательно, функция кроссплатформенная. Потому что при этом учитываются особенности Windows и Unix.
Lemming
1
В яблочко. Он не ведет себя одинаково на разных платформах, он дает правильный ответ для текущей платформы.
Кевин Кокс
Не отвечая на вопрос. Чтобы иметь кросс-платформенные правила, используйте ntpath или posixpath вместо os.path
Шохам
42

И если вам действительно нужен абсолютный путь, не пытайтесь проверить, есть ли он, просто получите abspath:

import os

print os.path.abspath('.')
Уэйн Вернер
источник
7
возможно, он не ответил на исходный вопрос, но это именно то, что я искал, не осознавая этого. Благодарность!
mephisto
7

Из 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:/')
Правин
источник
1
Этот ответ действительно работает в Windows .. Path('\tmp').is_absolute()дает правильно False, а os.path.isabs('\tmp')дает неправильно True. (Некоторые утверждают, что \tmpэто абсолютный путь в Windows, но это верно только для очень бесполезного определения абсолютного пути .)
Збыл,
6
import os.path

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

os.path.isabs('user')
False
Алексей Блисковский
источник
3
Я не думаю, что обратная косая черта сработает, по крайней мере, на моем Linux-сервере.
Константиний
4

На самом деле я думаю, что ни один из приведенных выше ответов не касался реальной проблемы: кроссплатформенных путей. Что делает 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
Шохам
источник
Да! В вопросе конкретно упоминаются как пути к окнам, так и пути Linux! Быстрый def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Оливер
-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переменной
Борис