Bir yolun Python ile platformlar arası şekilde mutlak yol mu yoksa göreceli yol mu olduğunu nasıl kontrol edebilirim?


142

UNIX mutlak yolu '/' ile başlarken, Windows 'C:' veya '\' alfabesiyle başlar. Python, bir yolun mutlak veya göreli olup olmadığını kontrol etmek için standart bir işleve sahip mi?

Yanıtlar:


208

os.path.isabsTrueyol mutlaksa döndürür , Falsedeğilse. Belgeler pencerelerde çalıştığını söylüyor (kişisel olarak Linux'ta çalıştığını onaylayabilirim).

os.path.isabs(my_path)

1
Bu işlev çapraz platform değildir. Unix'te os.path.isabs('c:\\')False değerini döndürür.
anatoly techtonik

69
Rotfl, ve False döndürmelidir, çünkü C: \\ Unix sisteminde mutlak bir yol değildir. Unix platformlarındaki mutlak yollar, "/ var / custApp /" vb. Gibi "/" ile başlar.
Marek Lewandowski

29
@techtonik Bunu bulabilen herkese mükemmel bir şekilde açıklamak için: c: \ `unix'te mükemmel bir şekilde geçerli bir dosya / dizin adıdır. Yani, bir unix sisteminde gerçekten göreceli bir yol olurdu. Bu nedenle, işlev çapraz platformdur. Çünkü, Windows ve Unix'in özelliklerini dikkate alır.
Lemming

1
Kesinlikle. Farklı platformlarda aynı şekilde davranmaz, mevcut platform için doğru cevabı verir.
Kevin Cox

Soruyu cevaplamamak. Platformlar arası kurallara sahip olmak için 'os.path' yerine 'ntpath' veya 'posixpath' kullanın
Shoham

43

Ve gerçekten istediğiniz şey mutlak yolsa, olup olmadığını kontrol etmekten çekinmeyin, sadece şunu elde edin abspath:

import os

print os.path.abspath('.')

7
orijinal soruyu cevaplamamış olabilir, ama tam olarak farkında olmadan aradığım şey. Teşekkürler!
mephisto


7
import os.path

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

os.path.isabs('user')
False

3
Ters eğik çizginin işe yarayacağını sanmıyorum, en azından linux kutumda çalışmıyor.
Constantinius

5

Aslında yukarıdaki cevapların hiçbirinin gerçek sorunu çözmediğini düşünüyorum: platformlar arası yollar. Os.path'ın yaptığı şey, 'path' kütüphanesinin işletim sistemine bağımlı versiyonunu yüklemektir. böylece çözüm ilgili (OS) yol kütüphanesini açıkça yüklemektir:

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

Evet! Soru özellikle hem pencerelerden hem de linux yollarından bahsediyor! Hemen hemen tüm kurulumlarda çalışan hızlı bir tek def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
hatlı

4

Gönderen python 3.4 pathlib mevcuttur.

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
Windows üzerinde Bu aslında cevabı eser .. Path('\tmp').is_absolute()doğru verir Falseiken, os.path.isabs('\tmp')yanlış verir True. (Bazıları bunun \tmpWindows'ta mutlak bir yol olduğunu iddia eder , ancak bu sadece mutlak yolun çok işe yaramaz bir tanımı için doğrudur .)
Zbyl

0

Geçerli çalışma dizininde değilseniz, başka bir yol biraz kirli ama benim için çalışıyor.

import re
path = 'my/relative/path'
# path = '..my/relative/path'
# path = './my/relative/path'

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.