¿Cómo verificar si una ruta es absoluta o relativa en multiplataforma con Python?

142

La ruta absoluta de UNIX comienza con '/', mientras que Windows comienza con el alfabeto 'C:' o '\'. ¿Python tiene una función estándar para verificar si una ruta es absoluta o relativa?

prosseek
fuente

Respuestas:

207

os.path.isabsdevuelve Truesi la ruta es absoluta, Falsesi no. La documentación dice que funciona en Windows (puedo confirmar que funciona en Linux personalmente).

os.path.isabs(my_path)
Donald Miner
fuente
1
Esta función no es multiplataforma. En Unix os.path.isabs('c:\\')regresa False.
anatoly techtonik
69
Rotfl, y debería devolver False, ya que C: \\ no es una ruta absoluta en el sistema Unix. Las rutas absolutas en plataformas Unix comienzan con "/", como "/ var / custApp /" etc. :)
Marek Lewandowski
29
@techtonik Para que quede perfectamente claro para cualquier otra persona que pueda encontrar esto: `c: \` es un nombre de archivo / directorio perfectamente válido en Unix. Entonces, realmente sería una ruta relativa en un sistema Unix. Por lo tanto, la función es multiplataforma. Porque toma en cuenta las especialidades de Windows y Unix.
Lemming
1
Exactamente. No se comporta igual en diferentes plataformas, da la respuesta correcta para la plataforma actual.
Kevin Cox
No respondiendo la pregunta. Para tener reglas multiplataforma, use 'ntpath' o 'posixpath' en lugar de 'os.path'
Shoham el
43

Y si lo que realmente quieres es el camino absoluto, no te molestes en comprobar si es así, solo obtén el abspath:

import os

print os.path.abspath('.')
Wayne Werner
fuente
77
Puede que no haya respondido a la pregunta original, pero exactamente lo que estaba buscando sin darme cuenta. ¡Gracias!
mephisto
7
import os.path

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

os.path.isabs('user')
False
Alex Bliskovsky
fuente
3
No creo que la barra invertida funcione, al menos no en mi caja de Linux.
Constantinius
5

En realidad, creo que ninguna de las respuestas anteriores abordó el problema real: las rutas multiplataforma. Lo que hace os.path es cargar la versión dependiente del sistema operativo de la biblioteca 'ruta'. así que la solución es cargar explícitamente la biblioteca de ruta relevante (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
Shoham
fuente
¡Si! ¡La pregunta específicamente menciona ventanas y rutas de Linux! Una línea rápida que funciona en casi todas las configuraciones: def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Oliver Zendel
4

De python 3.4 pathlib está disponible.

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
fuente
1
Esta respuesta realmente funciona en Windows ... Path('\tmp').is_absolute()da correctamente False, mientras que os.path.isabs('\tmp')da incorrectamente True. (Algunos dirían que \tmpes una ruta absoluta en Windows, pero eso solo es cierto para una definición muy inútil de una ruta absoluta ).
Zbyl
0

De otra manera, si no está en el directorio de trabajo actual, está un poco sucio, pero me funciona.

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
fuente