¿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?

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)

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

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

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

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

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.