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?

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)

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

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

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

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

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.