2015-05-13 20 views
5

Sono bloccato cercando di convertire un percorso Mac in un percorso POSIX in Python. Voglio convertire qualcosa di simile:Converti percorso mac in posix in python

'Main HD:Users:sasha:Documents:SomeText.txt' 

a questo:

'/Users/sasha/Documents/SomeText.txt' 

So che potrei semplicemente dividere la stringa in una lista e poi ricongiungersi con il separatore corretto. Ma credo che ci sia una soluzione molto più elegante che mi manca, forse coinvolgendo i moduli python "macpath" o "os.path". Tuttavia, non sono stato in grado di capire una funzione all'interno di questi moduli che farà il trucco di convertire tra i due formati.

Un ulteriore problema della semplice soluzione di manipolazione delle stringhe è che se ho più HD, una semplice soluzione non funzionerà. Per esempio:

Se si dispone di un percorso simile:

'Extra HD:SomeFolder:SomeOtherText.txt' 

vorremmo che per essere convertito in:

'/Volumes/Extra HD/SomeFolder/SomeOtherText.txt' 

Per non:

'/SomeFolder/SomeOtherText.txt' 
+1

Solo per curiosità, da dove viene il percorso come "Main HD: Users: sasha: Documents: SomeText.txt"? Sto usando OSX Mavericks ma non lo vedo mai prima di – number5

+0

È il modo pre-OS-X di specificare i percorsi di directory. Il nome del disco rigido viene prima, con un indicatore ':' che indica un percorso relativo. – chepner

+0

Come stai ottenendo questo percorso? Applescript? – duskwuff

risposta

2

si potrebbe usare Python per il modulo subprocess per questo:

#!/usr/bin/python 

import subprocess 

def asExec(ascript): 

    osa = subprocess.Popen(['osascript', '-'], 
          stdin=subprocess.PIPE, 
          stdout=subprocess.PIPE) 
    return osa.communicate(ascript)[0] 

def asConv(astr): 

    astr = astr.replace('"', '" & quote & "') 
    return '"{}"'.format(astr) 

def aScript(aspath): 

    ascript = ''' 
    set posixPath to POSIX path of {0} 
    '''.format(asConv(aspath)) 
    return ascript 

aliasPath = "Main HD:Users:sasha:Documents:SomeText.txt" 
print(asExec(aScript(aliasPath))) 

Risultato:

/Main HD/Users/Sasha/Documents/SomeText.txt

+1

Questo funziona correttamente per me SE il volume è in realtà un volume montato. Ovvero, "Macintosh HD: some: path" -> "/ some/path", "Other Volume: some: path" -> "/ Volumes/Other Volume/some/path". Ma fallisce se il volume non esiste, come in "Nonexistent Volume: some: path" -> "/ Nonexistent Volume/some/path". –

+1

Ok, questo funziona ed è elegante. grazie I'L'I – alexvicegrab

+0

@GordonDavisson: Posso usare qualsiasi cosa (ad es. .aliasPath = "foo: bar: baz" ') e restituisce'/foo/bar/baz', quindi non è chiaro il motivo per cui fallirebbe tu. –

1

Non ci sono metodi nella libreria standard. os.path fornisce metodi di manipolazione del percorso per il sistema operativo corrente e non ci sono metodi per convertire lo stile del percorso o modificare i separatori. I moduli di manipolazione del percorso os specifici come macpath, posixpath e ntpath non contengono metodi per convertire simboli di separatori di percorso e simili. (Fonte: os.path docs)

Come tale, penso che la sostituzione del separatore con la manipolazione delle stringhe sia una soluzione ragionevole per questo problema.