【问题标题】:Convert mac path to posix in python在python中将mac路径转换为posix
【发布时间】:2015-05-13 02:06:36
【问题描述】:

我一直在尝试将 Mac 路径转换为 ​​Python 中的 POSIX 路径。我想转换这样的东西:

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

到这里:

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

我知道我可以简单地将字符串拆分成一个列表,然后用正确的分隔符重新加入它。但我相信一定有一个更优雅的解决方案我错过了,可能涉及“macpath”或“os.path”python 模块。但是,我无法在这些模块中找到一个函数来实现两种格式之间的转换。

简单字符串操作解决方案的另一个问题是,如果我有多个 HD,那么简单的解决方案将不起作用。例如:

如果你有这样的路径:

'Extra HD:SomeFolder:SomeOtherText.txt'

我们希望将其转换为:

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

不要:

'/SomeFolder/SomeOtherText.txt'

【问题讨论】:

  • 只是出于好奇,'Main HD:Users:sasha:Documents:SomeText.txt' 之类的路径从何而来?我正在使用 OSX Mavericks,但以前从未见过
  • 这是指定目录路径的 pre-OS-X 方式。硬盘名称在前,前导 : 表示相对路径。
  • 你是怎么得到这条路的?苹果脚本?
  • @number5 我正在尝试通过 MegaSeg(音频播放器)数据库文件编写脚本,该文件具有这种格式的歌曲路径。
  • 附加信息似乎可以通过diskutil 将设备节点与卷名匹配,mount 将设备节点与挂载点匹配。给定一个卷名,通过diskutil list 或类似的方式找到哪个设备保存它,然后通过mount找到该卷的挂载点

标签: python macos path


【解决方案1】:

您可以为此使用 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/sasha/Documents/SomeText.txt

【讨论】:

  • 如果卷名实际上是已安装的卷,这对我来说可以正常工作。即“Macintosh HD:some:path”->“/some/path”、“Other Volume:some:path”->“/Volumes/Other Volume/some/path”。但如果卷不存在,它会失败,如“Nonexistent Volume:some:path”->“/Nonexistent Volume/some/path”。
  • @GordonDavisson:我可以使用任何东西(例如aliasPath = "foo:bar:baz")并返回/foo/bar/baz,所以不清楚为什么它会失败。
  • @l'L'l: /foo/bar/baz 不是正确的翻译——它应该是 /bar/baz(如果“foo”是启动盘)或 /Volumes/ foo/bar/baz(否则)。
  • @GordonDavisson:将foo:bar:baz 翻译成/foo/bar/baz/bar/baz,甚至/Volumes/foo/bar/baz/ 都没有区别——如果它是不存在的HFS 路径,它不会被翻译为一个有效的路径。如果场景需要全局查找/替换(忽略路径有效性),那么正则表达式可能更合适。
【解决方案2】:

标准库中没有任何方法。 os.path 为当前操作系统提供路径操作方法,没有转换路径样式或更改分隔符的方法。 macpathposixpathntpath等具体的os路径操作模块不包含转换路径分隔符等方法。 (来源:os.path docs

因此,我认为用字符串操作替换分隔符是解决此问题的合理解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 2019-08-18
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多