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.