Comment vérifier si un chemin est un chemin absolu ou un chemin relatif de manière multiplateforme avec Python?


142

Le chemin absolu UNIX commence par «/», alors que Windows commence par l'alphabet «C:» ou «\». Python a-t-il une fonction standard pour vérifier si un chemin est absolu ou relatif?

Réponses:


208

os.path.isabsrenvoie Truesi le chemin est absolu, Falsesinon. La documentation dit que cela fonctionne sous Windows (je peux confirmer que cela fonctionne sous Linux personnellement).

os.path.isabs(my_path)

1
Cette fonction n'est pas multiplateforme. Sous Unix os.path.isabs('c:\\')renvoie False.
anatoly techtonik

69
Rotfl, et il devrait retourner False, car C: \\ n'est pas un chemin absolu dans le système Unix. Les chemins absolus sur les plates-formes Unix commencent par "/", comme "/ var / custApp /" etc. :)
Marek Lewandowski

29
@techtonik Pour que cela soit parfaitement clair pour quiconque pourrait trouver ceci: `c: \` est un nom de fichier / répertoire parfaitement valide sous unix. Donc, ce serait vraiment un chemin relatif sur un système unix. Par conséquent, la fonction est multiplateforme. Car, il prend en compte les spécialités de Windows et d'Unix.
Lemming

1
Exactement. Il ne se comporte pas de la même manière sur différentes plateformes, il donne la bonne réponse pour la plateforme actuelle.
Kevin Cox

Je ne réponds pas à la question. Pour avoir des règles multiplateformes, utilisez 'ntpath' ou 'posixpath' au lieu de 'os.path'
Shoham

43

Et si ce que vous voulez vraiment est le chemin absolu, ne vous souciez pas de vérifier si c'est le cas, obtenez simplement le abspath:

import os

print os.path.abspath('.')

7
il n'a peut-être pas répondu à la question initiale, mais exactement ce que je cherchais sans m'en rendre compte. Merci!
mephisto


7
import os.path

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

os.path.isabs('user')
False

3
Je ne pense pas que la barre oblique inverse fonctionnera, du moins ce n'est pas le cas sur ma machine Linux.
Constantinius

5

En fait, je pense qu'aucune des réponses ci-dessus n'a abordé le vrai problème: les chemins multiplateformes. Ce que fait os.path est de charger la version dépendante du système d'exploitation de la bibliothèque 'path'. la solution est donc de charger explicitement la bibliothèque de chemins (OS) appropriée:

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

Oui! La question mentionne spécifiquement les chemins Windows et Linux! Un one-liner rapide qui fonctionne dans presque toutes les configurations: 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
Cette réponse fonctionne réellement sur Windows .. Path('\tmp').is_absolute()donne correctement False, tandis que os.path.isabs('\tmp')donne de manière incorrecte True. (Certains diraient que \tmpc'est un chemin absolu sur Windows, mais ce n'est vrai que pour une définition très inutile d'un chemin absolu .)
Zbyl

0

une autre façon si vous n'êtes pas dans le répertoire de travail actuel, un peu sale mais cela fonctionne pour moi.

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

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.