Wie kann ich mit Python auf plattformübergreifende Weise überprüfen, ob ein Pfad ein absoluter Pfad oder ein relativer Pfad ist?

142

Der absolute UNIX-Pfad beginnt mit '/', während Windows mit dem Alphabet 'C:' oder '\' beginnt. Hat Python eine Standardfunktion, um zu überprüfen, ob ein Pfad absolut oder relativ ist?

prosseek
quelle

Antworten:

207

os.path.isabsGibt zurück, Truewenn der Pfad absolut ist, Falsewenn nicht. Die Dokumentation besagt, dass es unter Windows funktioniert (ich kann bestätigen, dass es unter Linux persönlich funktioniert).

os.path.isabs(my_path)
Donald Miner
quelle
1
Diese Funktion ist nicht plattformübergreifend. Unter Unix wird os.path.isabs('c:\\')False zurückgegeben.
Anatoly Techtonik
69
Rotfl, und es sollte False zurückgeben, da C: \\ im Unix-System kein absoluter Pfad ist. Absolute Pfade auf Unix-Plattformen beginnen mit "/", wie "/ var / custApp /" usw. :)
Marek Lewandowski
29
@techtonik Um es allen anderen klar zu machen, die dies möglicherweise finden: `c: \` ist ein perfekt gültiger Datei- / Verzeichnisname unter Unix. Es wäre also wirklich ein relativer Pfad auf einem Unix-System. Daher ist die Funktion plattformübergreifend. Weil es die Besonderheiten von Windows und Unix berücksichtigt.
Lemming
1
Genau. Es verhält sich auf verschiedenen Plattformen nicht gleich, es gibt die richtige Antwort für die aktuelle Plattform.
Kevin Cox
Die Frage nicht beantworten. Haben plattformübergreifende Regeln verwenden ‚ntpath‘ oder ‚posixpath‘ anstelle von ‚os.path‘
Shoham
43

Und wenn das, was Sie wirklich wollen , ist der absolute Pfad, nicht die Mühe zu überprüfen, ob es ist, erhalten nur die abspath:

import os

print os.path.abspath('.')
Wayne Werner
quelle
7
es hat vielleicht nicht die ursprüngliche Frage beantwortet, aber genau das, wonach ich gesucht habe, ohne es zu merken. Vielen Dank!
Mephisto
7
import os.path

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

os.path.isabs('user')
False
Alex Bliskovsky
quelle
3
Ich glaube nicht, dass der Backslash funktioniert, zumindest nicht auf meiner Linux-Box.
Constantinius
5

Eigentlich denke ich, dass keine der oben genannten Antworten das eigentliche Problem angesprochen hat: plattformübergreifende Pfade. Os.path lädt die betriebssystemabhängige Version der 'path'-Bibliothek. Die Lösung besteht also darin, die relevante Pfadbibliothek (OS) explizit zu laden:

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
quelle
Ja! Die Frage erwähnt speziell sowohl Windows- als auch Linux-Pfade! Ein schneller Einzeiler, der in fast allen Setups funktioniert: def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Oliver Zendel
4

Von python 3.4 pathlib ist erhältlich.

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
quelle
1
Diese Antwort funktioniert tatsächlich unter Windows .. Path('\tmp').is_absolute()gibt richtig False, während os.path.isabs('\tmp')falsch gibt True. (Einige würden argumentieren, dass dies \tmpunter Windows ein absoluter Pfad ist, aber das gilt nur für eine sehr nutzlose Definition eines absoluten Pfads .)
Zbyl
0

Ein anderer Weg, wenn Sie nicht im aktuellen Arbeitsverzeichnis sind, ein bisschen schmutzig, aber es funktioniert für mich.

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
quelle