在Python中将Mac路径转换为POSIX

5
我是一名有帮助的助手,以下是您需要翻译的内容:

我正在尝试将Mac路径转换为Python中的POSIX路径。 我想要将以下内容转换为POSIX路径:

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

转换为:

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

我知道可以将字符串拆分为列表,然后使用正确的分隔符重新连接。但我相信我可能错过了一种更优雅的解决方案,可能涉及到 python 模块“macpath”或“os.path”。然而,我还没有能够找到这些模块中实现该转换的函数。
简单字符串操作的附加问题是,如果有多个硬盘,则简单的解决方法无法正常工作。例如:
如果您有如下路径:
'Extra HD:SomeFolder:SomeOtherText.txt'

我们希望将其转换为:
'/Volumes/Extra HD/SomeFolder/SomeOtherText.txt'

请勿:

'/SomeFolder/SomeOtherText.txt'

1
只是出于好奇,像“Main HD:Users:sasha:Documents:SomeText.txt”这样的路径是从哪里来的?我正在使用OSX Mavericks,但以前从未见过。 - number5
这是在OS X之前指定目录路径的方式。硬盘名称首先出现,前面带有“:”表示相对路径。 - chepner
你是如何获取这个路径的?使用Applescript吗? - user149341
@number5 我正在尝试通过MegaSeg(音频播放器)数据库文件进行脚本编写,该文件的歌曲路径格式如下。 - alexvicegrab
1
额外的信息似乎可以通过diskutil将设备节点匹配到卷名,以及通过mount将设备节点匹配到挂载点来获取。给定一个卷名,可以通过diskutil list或类似命令找到它所在的设备,然后通过mount找到该卷的挂载点。 - SingleNegationElimination
显示剩余2条评论
2个回答

2
您可以使用Python的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)))

结果:

/主硬盘/用户/sasha/文档/某些文本.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”。 - Gordon Davisson
@GordonDavisson: 我可以使用任何东西(例如aliasPath =“foo:bar:baz”),它都会返回/foo/bar/baz,所以不清楚为什么它会对您失败。 - l'L'l
@l'L'l:/foo/bar/baz 不是正确的翻译,应该是 /bar/baz(如果 "foo" 是启动磁盘)或 /Volumes/foo/bar/baz(否则)。 - Gordon Davisson
@GordonDavisson:将foo:bar:baz翻译成/foo/bar/baz/bar/baz或者甚至是/Volumes/foo/bar/baz/都没有区别——如果它是一个不存在的HFS路径,那么它不会被翻译成有效的路径。如果情景需要全局查找/替换(无视路径的有效性),那么正则表达式可能更为合适。 - l'L'l

1
标准库中没有任何方法。 os.path 提供了当前操作系统的路径操作方法,没有将路径样式转换或更改分隔符的方法。特定的操作系统路径操作模块(如 macpathposixpathntpath)不包含用于转换路径分隔符等的方法。(来源:os.path docs
因此,我认为使用字符串操作替换分隔符是解决此问题的合理方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接