質問
私はAppleScriptをプレイリストジェネレータを書いています。プロセスの一部は、ユーザのライブラリ内のジャンルのすべてのリストを取得するにはiTunesのライブラリの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を私はシェルスクリプトを実行し、結果をキャプチャすることができますので、、私は、シェルコマンドのいくつかのタイプを使用して、同じ動作を実現することができ、それはgrepすることが、perlの、または何か他のことを想像してみてください。私の* nixコマンドラインのスキルは非常に錆びていると私はいくつかのガイダンスを探しています。
だから、要するに、私はシェルから直接呼び出して同様の結果を得ることができるものに上記のpythonコードを変換する方法を見つけるしたいと思います。ありがとう!
解決
なぜあなたは、XMLを解析するために正規表現を使用していますか?なぜ適切なXMLライブラリを使用していませんか? PythonはDOM非常に簡単に歩いて作るElementTreeのようないくつかの偉大なユーティリティを持っており、それはむしろ、型指定されていない文字列よりも素敵な、フレンドリーなオブジェクトを生成します。
ここでは、AppleScriptを使用してXMLを解析するいくつかの方法があります:
あなたもAppleScriptをにして使用することができます。
AppleScriptををiTunesにフックすることができます同じように、それはこれらのような他のインストールされたユーティリティにフックすることができ、覚えておいてください。
最後に、それはデバッグのための方法、より良い開発ツールを持っており、はるかに高速に実行するので、単にPythonで全体のことを記述しない理由。あなたがヒョウを実行している場合、あなたは、Python 2.5.1がプリインストールされています。