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?

prosseek
la source

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)
Donald Miner
la source
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('.')
Wayne Werner
la source
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
Alex Bliskovsky
la source
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
Shoham
la source
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:/')
Praveen
la source
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)
Mahendra
la source