Перевод регулярного выражения Python в оболочку - PullRequest
1 голос
/ 05 февраля 2009

Я пишу генератор списков воспроизведения Applescript. Частью процесса является чтение XML-файла iTunes Library, чтобы получить список всех жанров в пользовательской библиотеке. Это реализация 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 в то, что я могу вызвать непосредственно из оболочки и получить аналогичный результат. Спасибо!

Ответы [ 3 ]

3 голосов
/ 05 февраля 2009

Почему вы используете регулярные выражения для анализа XML? Почему бы не использовать правильную библиотеку XML? В Python есть несколько замечательных утилит, таких как ElementTree, которые значительно облегчают работу с DOM, и он создает приятные, дружественные объекты, а не нетипизированные строки.

Вот несколько способов парсинга XML с использованием Applescript:

XML-парсер Applescript (Доступно с тех пор, как, по-видимому, Tiger)

Инструменты XML, которые вы также можете использовать с Applescript

Помните, точно так же, как Applescript может подключаться к iTunes, он может подключаться к другим установленным утилитам, подобным этим.

Наконец, почему бы просто не написать все это на Python, так как он имеет более совершенные инструменты разработки для отладки и работает намного быстрее. Если вы используете Leopard, у вас уже установлен Python 2.5.1.

0 голосов
/ 08 февраля 2009

Если вы уже работаете в AppleScript, почему бы просто не спросить iTunes напрямую?

tell application "iTunes" to get genre of every track of library playlist 1
0 голосов
/ 05 февраля 2009

Является ли создание отдельного приложения решением?

Посмотрите на py2app:

py2app, работает как py2exe, но предназначен для Mac OS

См

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...