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?

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)

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('.')

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

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

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

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.