Bagaimana cara mengecek apakah path adalah path absolut atau path relatif dalam lintas platform dengan Python?

142

Jalur absolut UNIX dimulai dengan '/', sedangkan Windows dimulai dengan alfabet 'C:' atau '\'. Apakah python memiliki fungsi standar untuk memeriksa apakah path absolut atau relatif?

prosseek
sumber

Jawaban:

207

os.path.isabskembali Truejika path absolut, Falsejika tidak. Dokumentasi mengatakan itu bekerja di windows (saya dapat mengonfirmasi itu bekerja di Linux secara pribadi).

os.path.isabs(my_path)
Donald Miner
sumber
1
Fungsi ini bukan lintas platform. On Unix os.path.isabs('c:\\')mengembalikan False.
anatoly techtonik
69
Rotfl, dan itu harus mengembalikan False, karena C: \\ bukan jalur absolut dalam sistem Unix. Path absolut pada platform unix dimulai dengan "/", seperti "/ var / custApp /" dll :)
Marek Lewandowski
29
@techtonik Untuk membuatnya jelas bagi siapa saja yang mungkin menemukan ini: `c: \` adalah nama file / direktori yang benar-benar valid di unix. Jadi, itu akan menjadi jalur relatif pada sistem unix. Oleh karena itu, fungsinya cross-platform. Karena, dibutuhkan spesialisasi Windows dan Unix.
Lemming
1
Persis. Itu tidak berlaku sama pada platform yang berbeda, itu memberikan jawaban yang benar untuk platform saat ini.
Kevin Cox
Tidak menjawab pertanyaan. Untuk memiliki aturan lintas platform, gunakan 'ntpath' atau 'posixpath' alih-alih 'os.path'
Shoham
43

Dan jika apa yang benar-benar Anda inginkan adalah jalan absolut, jangan repot-repot memeriksa apakah itu benar, dapatkan saja abspath:

import os

print os.path.abspath('.')
Wayne Werner
sumber
7
mungkin tidak menjawab pertanyaan awal, tetapi persis apa yang saya cari tanpa menyadarinya. Terima kasih!
mephisto
7
import os.path

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

os.path.isabs('user')
False
Alex Bliskovsky
sumber
3
Saya tidak berpikir bahwa backslash akan berfungsi, setidaknya tidak pada kotak linux saya.
Constantinius
5

Sebenarnya saya pikir tidak ada jawaban di atas yang membahas masalah sebenarnya: jalur lintas platform. Apa yang dilakukan os.path adalah memuat versi tergantung perpustakaan dari 'path' library. jadi solusinya adalah memuat pustaka path (OS) yang relevan secara eksplisit:

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
sumber
Iya! Pertanyaannya secara spesifik menyebutkan jalur windows dan linux! Satu def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
kalimat
4

Dari python 3.4 pathlib tersedia.

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
sumber
1
Jawaban ini benar-benar berfungsi pada Windows .. Path('\tmp').is_absolute()memberi dengan benar False, sementara os.path.isabs('\tmp')memberi secara tidak benar True. (Beberapa orang akan berpendapat bahwa itu \tmpadalah jalur absolut pada Windows, tetapi itu hanya berlaku untuk definisi jalur absolut yang sangat tidak berguna .)
Zbyl
0

cara lain jika Anda tidak dalam direktori kerja saat ini, agak kotor tetapi berfungsi untuk saya.

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
sumber