Уведомления

Группа в Telegram: @pythonsu

#1 Май 20, 2012 19:46:45

Tim32
Зарегистрирован: 2012-05-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.

Здравствуйте. Недавно у меня появилась такая идея.

Сделать программу, которая читает файл с любимыми треками из 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 чтоб он читал имена файлов так как они есть? Так же поможет любое другое решение проблемы.

Спасибо.

Офлайн

#2 Май 20, 2012 21:20:45

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.

Для начала хорошо бы показать, откуда берется f и root и какой у них тип.



Офлайн

#3 Май 20, 2012 21:48:09

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.

Питоноотсос: os.walk() возвращает str. Шел 2012 год, и даже линупсы перешли наконец-то на юникод, а питон все никак осилить не может.



Офлайн

#4 Май 20, 2012 22:34:23

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.

asilyator
Питоноотсос: os.walk() возвращает str. Шел 2012 год, и даже линупсы перешли наконец-то на юникод, а питон все никак осилить не может.

What’s New In Python 3.0 - February 14, 2009



Офлайн

#5 Май 21, 2012 00:05:37

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.

fata1ex
What’s New In Python 3.0
Там букв многа, что сказать хотел? Да и 2.х выкинуть прикажете?



Отредактировано asilyator (Май 21, 2012 00:06:05)

Офлайн

#6 Май 21, 2012 07:04:27

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.

asilyator
Питоноотсос: os.walk() возвращает str. Шел 2012 год, и даже линупсы перешли наконец-то на юникод, а питон все никак осилить не может.
А может стоит сначала документацию осилить?

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

Офлайн

#7 Май 21, 2012 08:22:49

Tim32
Зарегистрирован: 2012-05-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.

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

Офлайн

#8 Май 21, 2012 08:39:37

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.

Tim32, попробуйте передавать в os.walk и остальные функции работы с путями Юникод, т.е. вместо:

os.walk('H:\Music\Mantus')
нужно написать:
os.walk(u'H:\Music\Mantus')
а лучше:
os.walk(ur'H:\Music\Mantus')
т.к. в пути содержатся обратные слэши.

Правда print path скорее всего вызовет ислкючение, т.к. стандартная кодировка Win консоли (cp866) не поддерживает многие символы Юникода.

Офлайн

#9 Май 21, 2012 13:44:19

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.

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

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

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



Отредактировано asilyator (Май 21, 2012 13:46:48)

Офлайн

#10 Май 21, 2012 14:35:21

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

MP3 тэги. Кодировка. Проблемы.


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
Думаю, там все в Юникоде, но сейчас нет возможности проверить.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version