2014-11-26 2 views
0

Я пытаюсь зарегистрировать содержимое файла, но я получаю какое-то смешное поведение от модуля протоколирования (и не только этого).Печать успешно завершена, но исключение logging module исключает

Вот содержимое файла:

"Testing …" 
Testing å¨'æøöä 
"Testing å¨'æøöä" 

А вот как я могу открыть и зарегистрировать ее:

with codecs.open(f, "r", encoding="utf-8") as myfile: 
     script = myfile.read() 
     log.debug("Script type: {}".format(type(script))) 
     print(script) 
     log.debug("{}".format(script.encode("utf8"))) 

линии, где я вхожу тип объекта проявляется следующим образом в моем журналы:

Script type: <type 'unicode'> 

Затем print ... линия печатает содержимое правильно утешать, но, в Logg ИНГ модуль генерирует исключение:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/logging/__init__.py", line 882, in emit 
    stream.write(fs % msg.encode("UTF-8")) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 63: ordinal not in range(128) 

Когда я извлекаю .encode("utf8") немного от этой последней строки, я получаю ожидаемое исключение:

'ascii' codec can't encode character u'\u2026' in position 9: ordinal not in range(128) 

Это просто, чтобы продемонстрировать эту проблему. Это не только модуль регистрации. Остальная часть моего кода также вызывает аналогичные исключения при работе с этой строкой «unicode».

Что я делаю неправильно?

ответ

1

Logging обрабатывает значения Unicode просто отлично:

>>> import logging 
>>> logging.basicConfig(level=logging.DEBUG) 
>>> script = u'"Testing …"' 
>>> logging.debug(script) 
DEBUG:root:"Testing …" 

(Запись в лог-файл приведет к UTF-8 закодированные сообщения).

Где вы заладились является смешением байт строки и значений Unicode при использовании str.format():

>>> "{}".format(script) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 9: ordinal not in range(128) 

Если вы использовали строку unicode формата избежать принудительного неявного кодирования:

>>> u"{}".format(script) 
u'"Testing \u2026"' 
+0

Oh ! Смешивание юникода с ASCII ... Я сейчас стучу головой в стену (и набрав одновременно). Большое спасибо. Это должен быть один из тех дней ... Я буду отмечать это как ответ. –

Смежные вопросы