Python 2.7.2: plistlib с itunes xml

Я читаю созданный itunes xml плейлист с plistib. Xml имеет заголовок utf8.

Когда я читаю xml с plistib, я получаю как unicode (например, «Name»: u'Don \ u2019t You Remember »), так и строки байтов (например,« Name »:« Where Eagles Dare »).

Стандартный совет – как можно скорее декодировать то, что вы читаете с правильным кодированием, и использовать unicode в программе. Однако,

unicode_string.decode('utf8') 

терпит неудачу (как следует) с

 UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 3: ordinal not in range(128) 

Решение выглядит следующим образом:

 for name in names: if isinstance(name, str): name = name.decode('utf8') # etc. 

Это правильный способ решения проблемы? Есть ли способ лучше?

Я на окнах 7.

РЕДАКТИРОВАТЬ:

xml читается с:

 import plistlib xml = plistlb.readPlist(fn) for track in xml['Tracks']: info = xml['Tracks'][track] info['Name'] 

Производится в режиме ожидания:

 u'Don\u2019t You Remember' 'Where Eagles Dare' 

Вот файл xml:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Major Version</key><integer>1</integer> <key>Minor Version</key><integer>1</integer> <key>Date</key><date>2013-08-14T15:04:27Z</date> <key>Application Version</key><string>10.6.3</string> <key>Features</key><integer>5</integer> <key>Show Content Ratings</key><true/> <key>Music Folder</key><string>file://localhost/C:/Users/rdp/Music/iTunes/iTunes%20Media/</string> <key>Library Persistent ID</key><string>FE28CCACD9A36C34</string> <key>Tracks</key> <dict> <key>1019</key> <dict> <key>Track ID</key><integer>1019</integer> <key>Name</key><string>Where Eagles Dare</string> <key>Artist</key><string>Iron Maiden</string> <key>Album</key><string>Piece Of Mind</string> <key>Genre</key><string>Rock</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>7372755</integer> <key>Total Time</key><integer>370128</integer> <key>Track Number</key><integer>1</integer> <key>Year</key><integer>1983</integer> <key>Date Modified</key><date>2009-10-07T21:11:31Z</date> <key>Date Added</key><date>2008-02-07T16:04:15Z</date> <key>Bit Rate</key><integer>153</integer> <key>Sample Rate</key><integer>44100</integer> <key>Play Count</key><integer>4</integer> <key>Play Date</key><integer>3414416760</integer> <key>Play Date UTC</key><date>2012-03-12T21:06:00Z</date> <key>Artwork Count</key><integer>1</integer> <key>Persistent ID</key><string>FE28CCACD9A383E5</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/D:/music/Iron%20Maiden/Piece%20Of%20Mind/01%20Where%20Eagles%20Dare.mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>11559</key> <dict> <key>Track ID</key><integer>11559</integer> <key>Name</key><string>Don't You Remember</string> <key>Artist</key><string>Adele</string> <key>Album</key><string>21</string> <key>Genre</key><string>Pop</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>6120028</integer> <key>Total Time</key><integer>229511</integer> <key>Track Number</key><integer>4</integer> <key>Track Count</key><integer>11</integer> <key>Year</key><integer>2011</integer> <key>Date Modified</key><date>2012-11-17T10:50:31Z</date> <key>Date Added</key><date>2012-12-19T16:03:46Z</date> <key>Bit Rate</key><integer>199</integer> <key>Sample Rate</key><integer>44100</integer> <key>Artwork Count</key><integer>1</integer> <key>Persistent ID</key><string>7130C888606FB153</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/D:/music/Adele/21/04%20-%20Don%E2%80%99t%20You%20Remember.mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> </dict> <key>Playlists</key> <array> <dict> <key>Name</key><string>short</string> <key>Playlist ID</key><integer>30888</integer> <key>Playlist Persistent ID</key><string>166746C6572B0005</string> <key>All Items</key><true/> <key>Playlist Items</key> <array> <dict> <key>Track ID</key><integer>11559</integer> </dict> <dict> <key>Track ID</key><integer>1019</integer> </dict> </array> </dict> </array> </dict> </plist> 

One Solution collect form web for “Python 2.7.2: plistlib с itunes xml”

Вау, это действительно странное поведение. Я бы даже сказал, что это неоднородное поведение является ошибкой в ​​реализации plistlib plistlib в Python 3 всегда возвращает строки Unicode, которые намного лучше.

Но вы должны жить с ним 🙂 Итак, ответ на ваш вопрос – да. Вы должны всегда защищать себя при чтении строки из plist

 def safe_unicode(s): if isinstance(s, unicode): return s return s.decode('utf-8', errors='replace') value = safe_unicode(info['Name']) 

Я добавил errors='replace' если строка не кодируется utf-8 . Вы получите кучу символов \ufffd если их невозможно декодировать. Если вы скорее получите исключение, просто оставьте его и используйте e.decode('utf-8') .

Обновить:

Когда я попытался с ElementTree:

 from xml.etree import ElementTree as et tree = et.parse('test.plist') map(lambda x: x.text, tree.findall('dict/dict/dict')[1].findall('string')) 

Который дал мне:

 [u'Don\u2019t You Remember', 'Adele', '21', 'Pop', 'MPEG audio file', '7130C888606FB153', 'File', 'file://localhost/D:/music/Adele/21/04%20-%20Don%E2%80%99t%20You%20Remember.mp3'] 

Таким образом, строки unicode и байтов смешиваются: – /

  • Как обрабатывать XML в Python?
  • Почему elementtree.ElementTree.iterparse использует так много памяти?
  • Как преобразовать XML в объекты?
  • Потерянный в XML и Python
  • Создание очень больших XML-файлов в Python?
  • Как мне получить minidom, чтобы игнорировать пространства имен?
  • используйте xml.etree.elementtree для записи хорошо отформатированных xml-файлов
  • Как установить текстовое поле ElementTree Element в конструкторе
  • Как сгенерировать документы XML с пространствами имен в Python
  • Может ли кто-нибудь помочь мне с этим JAVA SAXParser?
  • Odoo - Скрыть кнопку для конкретного пользователя
  •  
    Interesting Posts for Van-Lav

    Извлеките два самых высоких элемента из списка, содержащего 100 000 целых чисел

    Как удалить промежутки между стержнями в гистограмме Matplotlib

    distutils: Как передать пользовательский параметр setup.py?

    Различные версии sklearn дают совершенно разные результаты обучения

    Преобразование чисел в классы в списке python

    Python Mechanize Browser: ошибка HTTP 460

    Перепишите URL-адреса для очистки перед отправкой запроса

    Устранение неполадок «дескриптор« дата »требует объекта« datetime.datetime », но получил« int »

    Простой способ сохранить содержимое ключа S3 в строке в boto3?

    Диалоговое окно опроса Tkinter

    ошибка установки python python

    Почему эквивалентный код Python настолько медленнее

    Подпроцесс Python: взаимодействие со сценарием оболочки

    Pythonic: диапазон vs перечислять в питоне для цикла

    Развертывание Django. Ошибка при загрузке модуля MySQLdb. Чтение / запись неисправностей из каталога / tmp

    Python - лучший язык программирования в мире.