Jak sprawdzić, czy ścieżka jest ścieżką bezwzględną czy ścieżką względną w sposób wieloplatformowy w Pythonie?

142

Ścieżka bezwzględna UNIX zaczyna się od „/”, podczas gdy Windows zaczyna się od alfabetu „C:” lub „\”. Czy Python ma standardową funkcję sprawdzającą, czy ścieżka jest bezwzględna czy względna?

prosseek
źródło

Odpowiedzi:

207

os.path.isabszwraca, Truejeśli ścieżka jest bezwzględna, Falsejeśli nie. Dokumentacja mówi, że działa w systemie Windows (osobiście mogę potwierdzić, że działa w systemie Linux).

os.path.isabs(my_path)
Donald Miner
źródło
1
Ta funkcja nie działa na wielu platformach. W systemie Unix os.path.isabs('c:\\')zwraca False.
anatoly techtonik
69
Rotfl i powinien zwrócić False, ponieważ C: \\ nie jest ścieżką bezwzględną w systemie Unix. Bezwzględne ścieżki na platformach uniksowych zaczynają się od „/”, np. „/ Var / custApp /” itp. :)
Marek Lewandowski
29
@techtonik Aby było to całkowicie jasne dla każdego, kto mógłby to znaleźć: `c: \` jest całkowicie poprawną nazwą pliku / katalogu w systemie unix. Tak więc naprawdę byłaby to ścieżka względna w systemie uniksowym. W związku z tym funkcja jest wieloplatformowa. Ponieważ bierze pod uwagę specjalizacje systemów Windows i Unix.
Lemming
1
Dokładnie. Nie zachowuje się tak samo na różnych platformach, daje poprawną odpowiedź dla bieżącej platformy.
Kevin Cox
Nie odpowiadając na pytanie. Aby mieć reguły międzyplatformowe, użyj „ntpath” lub „posixpath” zamiast „os.path”
Shoham
43

A jeśli naprawdę chcesz ścieżkę absolutną, nie przejmuj się sprawdzaniem, czy tak jest, po prostu pobierz abspath:

import os

print os.path.abspath('.')
Wayne Werner
źródło
7
może nie odpowiadało na pierwotne pytanie, ale dokładnie tego, czego szukałem, nie zdając sobie z tego sprawy. dzięki!
mephisto
7
import os.path

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

os.path.isabs('user')
False
Alex Bliskovsky
źródło
3
Nie sądzę, żeby lewy ukośnik zadziałał, przynajmniej nie działa na moim Linuksie.
Konstantyniusz
5

Właściwie myślę, że żadna z powyższych odpowiedzi nie dotyczyła prawdziwego problemu: ścieżek międzyplatformowych. To, co robi os.path, to załadowanie zależnej od systemu operacyjnego wersji biblioteki „path”. więc rozwiązaniem jest jawne załadowanie odpowiedniej biblioteki ścieżek (systemu operacyjnego):

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
źródło
Tak! Pytanie dotyczy zarówno okien, jak i ścieżek linuxowych! Szybka jedna linijka, która działa w prawie wszystkich konfiguracjach: def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Oliver Zendel
4

Z python 3.4 pathlib jest dostępne.

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
źródło
1
Ta odpowiedź faktycznie działa na Windowsie .. Path('\tmp').is_absolute()daje poprawnie False, a os.path.isabs('\tmp')podaje niepoprawnie True. (Niektórzy twierdzą, że \tmpjest to ścieżka absolutna w systemie Windows, ale dotyczy to tylko bardzo bezużytecznej definicji ścieżki absolutnej .)
Zbyl
0

inny sposób, jeśli nie jesteś w bieżącym katalogu roboczym, trochę brudny, ale dla mnie działa.

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
źródło