2013-10-01 3 views
1

я работаю на наборе данных публикации, и после извлечения данных из файла XML, я получил список такого рода:Декодирование списка закодированных строк

['21-10-2013', ['título do artigo'],['álvaro', 'joão', 'márcio'],['teste', 'operação','manobras']] 

Как вы можете видеть слова в португальском , Чтобы преобразовать в unicode, я попробовал код от Kumar McMillan, я получил в farmdev.com/talks/unicode/. Вот код:

>>> def to_unicode_or_bust(obj, encoding='utf-8'): 
...  if isinstance(obj, basestring): 
...   if not isinstance(obj, unicode): 
...    obj = unicode(obj, encoding) 
...  return obj 
... 

Я попробовал код в виде простой строки: аб = "trabalhar ком imaginação"

Выход:

>>> cd=to_unicode_or_bust(ab) 
u'trabalhar com a imagina\xe7\xe3o' 

Если я выполняю команду печати :

>>> print cd 
trabalhar com a imaginação 

Хорошо, похоже все в порядке. Но как я могу обратиться к списку? Наивные попытки:

>>> lista2 = to_unicode_or_bust(lista1) 
>>> print lista2 
['21-10-2013', ['t\xc3\xadtulo do artigo'], ['\xc3\xa1lvaro', 'jo\xc3\xa3o', 'm\xc3\xa1rcio'], ['teste', 'opera\xc3\xa7\xc3\xa3o', 'manobras']] 

Может быть, это вопрос новичка, я знаю, но то, что я должен сделать для того, чтобы получить правильные португальские символы в lista2?

+0

Кажется, что я правильно работал. Попробуйте выполнить рекурсию через список и распечатать фактические строки ... – FrankieTheKneeMan

+0

Возможный дубликат [Итерирование по списку на Python] (http://stackoverflow.com/questions/1571651/iterating-through-a-list-in-python) – Marcin

+0

Используйте цикл или понимание списка. – Marcin

ответ

2

Функция у вас есть только штраф, но он работает только на одной строке за один раз - если он передал что-то, отличное от строки, отличной от юникода, он просто возвращает ее. Вы передаете его list, и он возвращается к вам без изменений.

Эта рекурсивная функция должна проходить через каждый бит и собирать ее с преобразованными строками.

def convert_all(all, convert=to_unicode_or_bust): 
    if isinstance(all, tuple): 
     return tuple(convert_all(piece, convert) for piece in all) 
    elif isinstance(all, list): 
     return [convert_all(piece, convert) for piece in all] 
    return convert(all) 

Имейте в виду, что при печати list, все строки в списке будут иметь символы Unicode, показанные с формате \x-- или \u----, но отдельные строки будут напечатаны неправильно.

+0

Спасибо, я буду использовать ваше предложение. – hjmnzs

+0

Хорошо, спасибо, Марк Рэнсом, все прошло отлично! – hjmnzs

-1

если у вас есть сама строка, которую вы можете использовать следующий синтаксис:

mystring = u'سلام' 

, если у вас нет у «» Python игнорировать Юникод базы.

Но команда печати: вы должны использовать:

print str.decode('utf-8') 

ваши переменные:

mystring = unicode(myvar) 
Смежные вопросы