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.