2012-10-31 4 views
19

Sto creando un'applicazione che memorizza i file BLOB nel disco rigido, ma questo script deve essere eseguito sia in linux che in windows, il problema è che voglio dargli un percorso assoluto da il root del filesystem e non uno relativo ai file di progetto, questo perché sto usando git e non voglio occuparmi di escludere tutti questi file dalla sincronizzazione.Utilizzo di percorsi unix assoluti in windows con python

quindi mi piacerebbe avere qualcosa di simile:

path = '/var/lib/blob_files/' 
file = open(path+'myfile.blob', 'w') 

e ottenere un file in unix a:

/var/lib/blob_files/myfile.blob 

e finestre:

C:\var\lib\blob_files\myfile.blob 

che poteva anche essere relativo alla cartella home dell'utente (/ home/utente in unix e C:/Users/User in windows) ma suppongo che il problema sia molto simile.

Come posso ottenere questo? c'è qualche libreria o funzione che può aiutarmi in modo trasparente a convertire questi percorsi senza dover chiedere in quale piattaforma è sempre in esecuzione lo script?

delle mie due opzioni, assoluto da root o relativo dalla cartella home, quale si consiglia di utilizzare?

Grazie in anticipo per qualsiasi consiglio su questo

+0

possibile duplicato del [percorsi di file indipendente dalla piattaforma?] (Http://stackoverflow.com/questions/6036129/platform-independent-file-paths) – dm03514

+7

Non un duplicato. Andiamo ragazzi, diamo una pausa alle nuove persone. –

+1

Non sono sicuro del motivo per cui pensi di aver bisogno di un percorso assoluto "perché sto usando git e non voglio occuparmi di escludere tutti questi file". Come segue?In ogni caso, sembra che qui abbia più senso il parente di casa, perché gli utenti di Windows non avranno una directory chiamata 'C: \ var \ lib \', quindi creare 'C: \ var \ lib \ blob_files' sarà strano , ma la creazione dell'equivalente di Windows di ~ ~/.blob_files' è perfettamente ragionevole. – abarnert

risposta

27

Usa os.path.abspath(), e anche os.path.expanduser() per i file relativo alla directory home dell'utente:

print os.path.abspath("/var/lib/blob_files/myfile.blob") 
>>> C:\var\lib\blob_files\myfile.blob 

print os.path.abspath(os.path.expanduser("~/blob_files/myfile.blob")) 
>>> C:\Users\jerry\blob_files\myfile.blob 

Questi "fanno la cosa giusta" per entrambi i percorsi Windows e POSIX.

expanduser() non cambierà il percorso se non contiene uno ~, quindi è possibile utilizzarlo in modo sicuro con tutti i percorsi. Così, si può facilmente scrivere una funzione wrapper:

import os 
def fixpath(path): 
    return os.path.abspath(os.path.expanduser(path)) 

Si noti che la lettera di unità utilizzato sarà l'unità specificata dalla directory di lavoro corrente del processo di Python, di solito la directory lo script è in (se l'avvio da Windows Explorer e presumendo che lo script non lo modifichi). Se si vuole forzarlo ad essere sempre C: si può fare qualcosa di simile:

import os 
def fixpath(path): 
    path = os.path.normpath(os.path.expanduser(path)) 
    if path.startswith("\\"): return "C:" + path 
    return path 
+0

grazie mille questo è esattamente quello che stavo cercando – jeruki

+3

Non hai bisogno di 'abspath' qui; hai bisogno di 'normpath'. È vero che 'abspath' chiama implicitamente' normpath', ma dovresti chiamare la funzione giusta per il lavoro, non quella che capita di funzionare per sbaglio. Inoltre, questo sarà effettivamente su 'C:', o sul disco corrente? (E quale è appropriato per l'uso dell'OP?) – abarnert

+0

Ho scelto 'abspath()' intenzionalmente poiché 'normpath()' non aggiunge la lettera di unità al percorso restituito. Non è stato un incidente. La lettera di unità sarà quella sulla directory corrente in cui risiede lo script Python (aggiornerò la mia risposta di conseguenza). – kindall

0

Ok, ho ottenuto una risposta da solo.

os.path.exists(os.path.abspath(filePath)) 

Forse sarà utile per chiunque