2012-11-19 11 views
5

Sto scrivendo un navigatore di directory da riga di comando per Windows in Python e sto faticando un po 'con os.path.join. Ecco, in sostanza, quello che sto cercando di fare:os.path.join non ha correttamente formattato il percorso

abspath = "C:\Python32\Projects\ls.py" 
abspath = abspath.split('\\') 
print(abspath) #this prints ['C:', 'Python32', 'Projects', 'ls.py'] 

if(options.mFlag): 
     print(os.path.join(*abspath)) #this prints C:Python32\Projects\ls.py 
     m = time.ctime(os.path.getmtime(os.path.join(*abspath))) #this throws an exception 

Il problema è che os.path.join non è l'inserimento di un '/' dopo 'C:' e non riesco a capire perché. Qualsiasi aiuto?

Modifica: Nel caso in cui qualcuno in futuro venga qui cercando una soluzione, ho appena aggiunto os.sep dopo "C:" invece di eseguire il backup di una barra rovesciata e ha funzionato.

risposta

6

Da the documentation:

Nota che su Windows, poiché non v'è una directory corrente per ogni unità, os.path.join("c:", "foo") rappresenta un percorso relativo alla directory corrente sull'unità C: (c: foo), non c: \ foo.

E 'un po' difficile dire cosa si sta cercando di realizzare, dal momento che tutto il codice sembra essere l'obiettivo di è quello di dividere il percorso e poi rimetterlo insieme esattamente il modo in cui è stato, in questo caso il motivo dividerlo in primo luogo? Ma forse os.path.splitdrive ti sarà d'aiuto? Si divide la lettera di unità dal percorso.

+0

Il punto di questo blocco è rendere la piattaforma del programma indipendente. Prima di inserire questa funzione, il codice non veniva eseguito correttamente in OSX. Grazie per il suggerimento, proverò splitdrive. – bkaiser

+0

@benjaminhkaiser: Un'altra cosa che puoi fare è usare '/' come separatore di percorso invece di \. Funzionerà ancora su Windows ma funzionerà anche su altre piattaforme. – BrenBarn

+0

Quindi, come facciamo ad aggiungere la barra in modo corretto? 'os.path.join (os.getenv (" SystemDrive "), 'somepath')' == ''C: somepath'' – endolith

3

La documentazione (http://docs.python.org/2/library/os.path.html) specificare questo comportamento:

Nota che su Windows, poiché non v'è una directory corrente per ogni unità, os.path.join ("c:", "foo") rappresenta un percorso relativo alla directory corrente sull'unità C: (c: pippo), non c: \ pippo.

+1

C'è una soluzione facile o dovrei inserire manualmente il backslash (o semplicemente inserire os.sep)? Mi sento come se ciò avrebbe vanificato lo scopo di utilizzare os.path.join. – bkaiser

+0

Una possibile soluzione non è dividere il percorso manualmente, ma piuttosto usare 'os.path.split'. Ciò non rimuoverà correttamente il '' 'tra la lettera dell'unità e la directory radice. – Blckknght

+0

@benjaminhkaiser: Che cosa stai cercando di fare? – BrenBarn

Problemi correlati