Non c'è davvero nulla nel modulo os.path
per farlo. Ogni tanto qualcuno suggerisce di creare una funzione splitall
che restituisce una lista (o iteratore) di tutti i componenti, ma non ha mai ottenuto una trazione sufficiente. In parte questo perché ogni volta che qualcuno ha mai suggerito di aggiungere nuove funzionalità a os.path
, ha riacceso l'insoddisfazione di vecchia data con il progetto generale della libreria, portando a qualcuno che propone una nuova API più simile a OO per percorsi a deprecato dell'OS, clunky API. Nel 3.4, finalmente è successo, con pathlib
. E ha già funzionalità che non erano in os.path
. Quindi:
>>> p = pathlib.Path('/First/Second/Third/Fourth/Fifth')
>>> p.parts[2:]
('Third', 'Fourth', 'Fifth')
>>> pathlib.Path(*p.parts[2:])
PosixPath('Second/Third/Fourth/Fifth')
Oppure ... sei sicuro di voler veramente rimuovere il primo componente, piuttosto che farlo?
>>> p.relative_to(*p.parts[:2])
PosixPath('Second/Third/Fourth/Fifth')
Se avete bisogno di fare questo in 2,6-2,7 o 3,2-3,3, c'è un backport of pathlib
.
Naturalmente, è possibile utilizzare la manipolazione di stringhe, fino a quando si sta attenti a normalizzare il percorso e utilizzare os.path.sep
, e per essere sicuri di gestire i dettagli poco pratici con percorsi non assoluti o con sistemi con lettere di unità, e ...
Oppure puoi semplicemente concludere il tuo ricorsivo os.path.split
. Che cosa è esattamente "non ottimale" a riguardo, una volta concluso? Potrebbe essere un po 'più lento, ma stiamo parlando di nanosecondi qui, molti ordini di grandezza più veloce di persino chiamare stat
su un file. Avrà problemi di profondità della ricorsione se hai un filesystem con 1000 directory profonde, ma ne hai mai visto uno? (Se è così, puoi sempre trasformarlo in un loop ...) Ci vogliono alcuni minuti per avvolgerlo e scrivere buoni test unitari, ma è qualcosa che devi fare una sola volta e non preoccuparti mai più. Quindi, onestamente, se non vuoi usare pathlib
, è quello che farei.
'pathlib' dosent fornito con python, è necessario installarlo – Hackaholic
per quanto riguarda le prestazioni avete perfettamente ragione: stiamo parlando di nanosecondi; è più che sto cercando di imparare il modo migliore/altri modi per farlo – meto
@Hackaholic: come la risposta spiega in dettaglio, 'pathlib' viene fornito con Python 3.4+, ed è possibile installare il backport per 2.6-2.7 o 3.2-3.3 . – abarnert