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?

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)

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

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

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

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

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.