Come verificare se un percorso è percorso assoluto o percorso relativo in modo multipiattaforma con Python?


142

Il percorso assoluto di UNIX inizia con '/', mentre Windows inizia con l'alfabeto 'C:' o '\'. Python ha una funzione standard per verificare se un percorso è assoluto o relativo?

Risposte:


208

os.path.isabsritorna Truese il percorso è assoluto, in Falsecaso contrario. La documentazione dice che funziona su Windows (posso confermare che funziona su Linux personalmente).

os.path.isabs(my_path)

1
Questa funzione non è multipiattaforma. Su Unix os.path.isabs('c:\\')restituisce False.
Anatoly Techtonik,

69
Rotfl, e dovrebbe restituire False, poiché C: \\ non è un percorso assoluto nel sistema Unix. I percorsi assoluti su piattaforme unix iniziano con "/", come "/ var / custApp /" ecc. :)
Marek Lewandowski,

29
@techtonik Per chiarire perfettamente a chiunque altro possa trovarlo: `c: \` è un nome file / directory perfettamente valido in unix. Quindi, sarebbe davvero un percorso relativo su un sistema unix. Quindi, la funzione è multipiattaforma. Perché, prende in considerazione le specialità di Windows e Unix.
Lemming,

1
Esattamente. Non si comporta allo stesso modo su piattaforme diverse, fornisce la risposta corretta per la piattaforma corrente.
Kevin Cox,

Non rispondere alla domanda. Per avere regole multipiattaforma usa 'ntpath' o 'posixpath' invece di 'os.path'
Shoham

43

E se quello che vuoi davvero è il percorso assoluto, non preoccuparti di controllare se lo è, basta ottenere abspath:

import os

print os.path.abspath('.')

7
potrebbe non aver risposto alla domanda originale, ma esattamente quello che stavo cercando senza accorgermene. Grazie!
mephisto


7
import os.path

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

os.path.isabs('user')
False

3
Non penso che la barra rovesciata funzionerà, almeno non sulla mia scatola di Linux.
Costantino,

5

In realtà penso che nessuna delle risposte di cui sopra abbia affrontato il vero problema: percorsi multipiattaforma. Ciò che os.path fa è caricare la versione dipendente dal sistema operativo della libreria 'path'. quindi la soluzione è caricare esplicitamente la libreria dei percorsi (OS) pertinente:

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

Sì! La domanda menziona specificamente sia i percorsi Windows che Linux! Un veloce one-liner che funziona in quasi tutte le configurazioni: def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Oliver Zendel

4

Da python 3.4 pathlib è disponibile.

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
Questa risposta funziona davvero su Windows .. Path('\tmp').is_absolute()dà correttamente False, mentre os.path.isabs('\tmp')dà in modo errato True. (Alcuni sosterrebbero che \tmpè un percorso assoluto su Windows, ma questo è vero solo per una definizione molto inutile di un percorso assoluto .)
Zbyl

0

un altro modo se non ci si trova nella directory di lavoro corrente, un po 'sporca ma funziona per me.

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

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.