Найти - Пользователи
Полная версия: MP3 тэги. Кодировка. Проблемы.
Начало » Python для новичков » MP3 тэги. Кодировка. Проблемы.
1 2 3 4 5 6
Tim32
Здравствуйте. Недавно у меня появилась такая идея.

Сделать программу, которая читает файл с любимыми треками из lastfm. Потом ищет эти треки на жестком диске и создает автоматом плейлист AIMP. Где все пути к файлам уже прописаны и можно слушать. Звучит, как что то бесполезное, но мне не хватает такой проги)

Прохожу по папке с файлами. Если файл mp3,то читаю его и засовываю в модуль для работы с ID3, чтоб он вытащил имя трека и артиста.

path = (os.path.join(root,f))
song = ID3(path)
if (song.title == title) and (song.artist == artist):
return path
Вот проблема.

В переменной path содержится строка
H:\Music\Mantus\2002 - Fremde Welten\07.Mantus - Phonix.mp3
А на самом деле файл выглядит так
H:\Music\Mantus\2002 - Fremde Welten\07.Mantus - Phönix.mp3
Вот эта буква ö при чтении превращается как то в обычную o и в итоге обработчик тега получает ссылку на несуществующий файл. При чем так с всеми символами типа ö ß ä и т.д.

Пытался регуляркой найти такие символы, но не находит потому что в path они уже нормальные. Можно как нибудь настроить os.path чтоб он читал имена файлов так как они есть? Так же поможет любое другое решение проблемы.

Спасибо.
asilyator
Для начала хорошо бы показать, откуда берется f и root и какой у них тип.
asilyator
Питоноотсос: os.walk() возвращает str. Шел 2012 год, и даже линупсы перешли наконец-то на юникод, а питон все никак осилить не может.
fata1ex
asilyator
Питоноотсос: os.walk() возвращает str. Шел 2012 год, и даже линупсы перешли наконец-то на юникод, а питон все никак осилить не может.

What’s New In Python 3.0 - February 14, 2009
asilyator
fata1ex
What’s New In Python 3.0
Там букв многа, что сказать хотел? Да и 2.х выкинуть прикажете?
reclosedev
asilyator
Питоноотсос: os.walk() возвращает str. Шел 2012 год, и даже линупсы перешли наконец-то на юникод, а питон все никак осилить не может.
А может стоит сначала документацию осилить?

Если os.walk и другим методам os передавать Юникод, то и возвращаться будет Юникод, при условии поддержки его файловой системой. Это как раз и будет решением проблемы ТС.
Tim32
Python использую 2.7

Вот полностью функция (os.walk тоже используется)
def findfiles(title,artist):
    for root, dirs, files in os.walk('H:\Music\Mantus'):
        for f in files:
            if '.mp3' in f:
                path = (os.path.join(root,f))
                print path
                song = ID3(path)
                if (song.title == title) and (song.artist == artist):
                    return path
reclosedev
Tim32, попробуйте передавать в os.walk и остальные функции работы с путями Юникод, т.е. вместо:
os.walk('H:\Music\Mantus')
нужно написать:
os.walk(u'H:\Music\Mantus')
а лучше:
os.walk(ur'H:\Music\Mantus')
т.к. в пути содержатся обратные слэши.

Правда print path скорее всего вызовет ислкючение, т.к. стандартная кодировка Win консоли (cp866) не поддерживает многие символы Юникода.
asilyator
reclosedev
А может стоит сначала документацию осилить?
1. Возвращать ascii пути в зависимости от типа пути - это пушка. При том, что единственная ОС, которую я знаю, которая не поддерживает юникод в ФС - мертвая win9x.
2. А не подскажешь ли, где же в документации этот нюанс указан? Может ты ее как-то по особенному осилил?

В тройке этот прикол сохранен, или там по уму сделали?

Tim32, и тогда уже f.endswith('.mp3'). И скобки вокруг path = (os.path.join(root,f)) и в if лишние.
reclosedev

asilyator
1. Возвращать ascii пути в зависимости от типа пути - это пушка.
Какая-то логика в этом есть, не все программы поддерживают юникод, + обратная совместимость с <2.3. И кстати не в ascii, а в той, которую вернет sys.getfilesystemencoding(), в случае с Win - это mbcs.
При том, что единственная ОС, которую я знаю, которая не поддерживает юникод в ФС - мертвая win9x.
Есть еще Symbian и прочий Embeded
asilyator
2. А не подскажешь ли, где же в документации этот нюанс указан? Может ты ее как-то по особенному осилил?
Вот здесь: os.listdir
asilyator
В тройке этот прикол сохранен, или там по уму сделали?
File Names, Command Line Arguments, and Environment Variables
Думаю, там все в Юникоде, но сейчас нет возможности проверить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB