将Python Regex翻译为Shell

时间:2009-02-05 06:10:40

标签: python applescript

我正在编写一个Applescript播放列表生成器。部分过程是阅读iTunes Library XML文件以获取用户库中所有类型的列表。这是python实现,它按照我的意思运行:

    #!/usr/bin/env python

# script to get all of the genres from itunes

import re,sys,sets


## Boosted from the internet to handle HTML entities in Genre names
def unescape(text):
    def fixup(m):
        text = m.group(0)
        if text[:2] == "&#":
            # character reference
            try:
                if text[:3] == "&#x":
                    return unichr(int(text[3:-1], 16))
                else:
                    return unichr(int(text[2:-1]))
            except ValueError:
                pass
        else:
            # named entity
            try:
                text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
            except KeyError:
                pass
        return text # leave as is
    return re.sub("&#?\w+;", fixup, text)


# probably faster to use a regex than to try to walk
# the entire xml document and aggregate the genres
try:
    xml_path = "/Users/%s/Music/iTunes/iTunes Music Library.xml" % sys.argv[1]
except:
    print '\tUsage: python '+sys.argv[0]+' <your OSX username>'
    raise SystemExit

pattern = "<key>Genre</key><string>([^<]+)</string>" 

try:
    xml = file(xml_path,'r').read()
except:
    print '\tUnable to load your iTunes Library XML file'
    raise SystemExit

matches = re.findall(pattern,xml)
uniques = map(unescape,list(sets.Set(matches)))
## need to write these out somewhere so the applescript can read them
sys.stdout.write('|'.join(uniques))
raise SystemExit

问题是,我希望Applescript是自包含的,并且不要求存在这个附加文件(我计划将其提供给其他人)。而且,据我所知,Applescript不提供开箱即用的任何类型的正则表达式功能。我可以遍历库中的每个轨道以获得所有类型,但这是一个非常漫长的过程,我在构建播放列表时已经做过一次。所以,我正在寻找其他选择。

由于Applescript允许我运行shell脚本并捕获结果,我想我可以使用某种类型的shell命令来完成相同的行为,无论是grep,perl还是其他什么。我的* nix命令行技能非常生疏,我正在寻找一些指导。

因此,简而言之,我想找到一种方法将上面的python代码翻译成我可以直接从shell调用并得到类似结果的东西。谢谢!

3 个答案:

答案 0 :(得分:3)

为什么使用正则表达式来解析XML?为什么不使用合适的XML库? Python有一些很棒的实用程序,比如ElementTree,它使得DOM更容易行走,并且它产生了友好的,友好的对象,而不是无类型的字符串。

以下是使用Applescript解析XML的一些方法:

Applescript XML Parser(自Tiger以来可用)

XML Tools you can also use with Applescript

请记住,就像Applescript可以挂钩iTunes一样,它可以挂钩到其他已安装的实用程序中。

最后,为什么不用Python编写全部内容,因为它有更好的调试开发工具,运行速度更快。如果您正在运行Leopard,则预先安装了Python 2.5.1。

答案 1 :(得分:0)

创建一个独立的应用程序解决方案吗?

看看py2app:

py2app,像py2exe一样工作但是以Mac OS为目标

See

答案 2 :(得分:0)

如果您已经使用AppleScript,为什么不直接询问iTunes?

tell application "iTunes" to get genre of every track of library playlist 1