Como verificar se um caminho é absoluto ou relativo em uma plataforma cruzada com o Python?

142

O caminho absoluto do UNIX começa com '/', enquanto o Windows começa com o alfabeto 'C:' ou '\'. O python tem uma função padrão para verificar se um caminho é absoluto ou relativo?

prosseek
fonte

Respostas:

207

os.path.isabsretorna Truese o caminho for absoluto, Falsese não. A documentação diz que funciona no Windows (posso confirmar que funciona no Linux pessoalmente).

os.path.isabs(my_path)
Donald Miner
fonte
1
Esta função não é multiplataforma. No Unix os.path.isabs('c:\\')retorna False.
Anatoly techtonik
69
Rotfl, e ele deve retornar False, pois C: \\ não é um caminho absoluto no sistema Unix. Caminhos absolutos Em plataformas UNIX começa com "/", como "/ var / custApp /" etc. :)
Marek Lewandowski
29
@techtonik Para deixar perfeitamente claro para qualquer pessoa que possa encontrar isso: `c: \` é um nome de arquivo / diretório perfeitamente válido no unix. Então, seria realmente um caminho relativo em um sistema unix. Portanto, a função é multiplataforma. Porque leva em consideração as especialidades do Windows e Unix.
Lemming
1
Exatamente. Ele não se comporta da mesma maneira em plataformas diferentes, fornece a resposta correta para a plataforma atual.
Kevin Cox
Não estou respondendo a pergunta. Para ter regras de plataforma cruzada, use 'ntpath' ou 'posixpath' em vez de 'os.path'
Shoham
43

E se o que você realmente deseja é o caminho absoluto, não se preocupe em verificar se é, basta obter o abspath:

import os

print os.path.abspath('.')
Wayne Werner
fonte
7
pode não ter respondido à pergunta original, mas exatamente o que eu estava procurando sem perceber. obrigado!
mephisto
7
import os.path

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

os.path.isabs('user')
False
Alex Bliskovsky
fonte
3
Eu não acho que a barra invertida funcionará, pelo menos não na minha caixa Linux.
Constantinius
5

Na verdade, acho que nenhuma das respostas acima abordou o problema real: caminhos de plataforma cruzada. O que o os.path faz é carregar a versão dependente do SO da biblioteca 'path'. portanto, a solução é carregar explicitamente a biblioteca de caminhos relevante (SO):

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
Shoham
fonte
Sim! A pergunta menciona especificamente os caminhos do Windows e do Linux! Um one-liner rápido que funciona em quase todas as configurações: def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Oliver Zendel 13/03/19
4

Do python 3.4 pathlib está disponível.

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:/')
Praveen
fonte
1
Esta resposta realmente funciona no Windows .. Path('\tmp').is_absolute()dá corretamente False, enquanto os.path.isabs('\tmp')dá incorretamente True. (Alguns argumentam que esse \tmpé um caminho absoluto no Windows, mas isso é verdade apenas para uma definição muito inútil de um caminho absoluto .)
Zbyl
0

de outra maneira, se você não está no diretório de trabalho atual, meio sujo, mas funciona para mim.

import re
path = 'my/relative/path'
# path = '..my/relative/path'
# path = './my/relative/path'

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
Mahendra
fonte