2015-05-13 2 views
5

Я застрял, пытаясь преобразовать Mac-путь в POSIX-путь в Python. Я хочу, чтобы преобразовать что-то вроде этого:Преобразование mac-пути в posix в python

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

к этому:

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

Я знаю, что я мог бы просто разбить строку в списке, а затем воссоединиться его с правильным разделителем. Но я считаю, что должно быть гораздо более элегантное решение, которое мне не хватает, возможно, с использованием модулей python «macpath» или «os.path». Тем не менее, я не смог определить функцию внутри этих модулей, которая будет делать трюк преобразования двух форматов.

Дополнительная проблема простого решения для обработки строк заключается в том, что если у меня есть несколько HD-дисков, тогда простое решение не будет работать. Например:

Если у вас есть путь:

'Extra HD:SomeFolder:SomeOtherText.txt' 

мы хотим, чтобы быть преобразованы в:

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

Не:

'/SomeFolder/SomeOtherText.txt' 
+1

Просто из любопытства, где путь, как «Основной HD: Пользователи: sasha: Documents: SomeText.txt»? Я использую OSX Mavericks, но никогда не вижу этого до – number5

+0

Это путь до OS-X для указания путей к каталогам. Имя на жестком диске начинается с первого символа ':', указывающего относительный путь. – chepner

+0

Как вы получаете этот путь? Applescript? – duskwuff

ответ

2

Вы можете использовать Pythons subprocess модуль для этого:

#!/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))) 

Результат:

/Main HD/Users/саша/Документы/SomeText.txt

+1

Это работает правильно для меня, если имя тома фактически является смонтированным томом. То есть «Macintosh HD: some: path» -> «/ some/path», «Other Volume: some: path» -> «/ Volumes/Other Volume/some/path». Но он терпит неудачу, если громкость не существует, как в «Nonexistent Volume: some: path» -> «/ Nonexistent Volume/some/path». –

+1

Хорошо, это работает и элегантно. спасибо I'L'I – alexvicegrab

+0

@GordonDavisson: Я могу использовать что угодно (например, 'aliasPath = "foo: bar: baz" '), и он возвращает'/foo/bar/baz', поэтому неясно, почему это не получится вы. –

1

Там нет никаких методов в стандартной библиотеке. os.path содержит методы манипулирования потоками для текущих os, и нет методов для преобразования стилей пути или разделителей изменений. Конкретные модули манипуляции с os, такие как macpath, posixpath и ntpath, не содержат способов для преобразования символов разделителя пути и т.п. (Источник: os.path docs)

Как таковой, я думаю, что замена разделителя на строковые манипуляции является разумным решением этой проблемы.

Смежные вопросы