打印成功但日志记录模块抛出异常

时间:2014-11-26 13:47:30

标签: python python-2.7 logging encoding python-unicode

我正在尝试记录文件的内容,但是我从日志记录模块(而不仅仅是那个)获得了一些有趣的行为。

这是文件内容:

"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 ...行将内容正确打印到控制台,但是,日志记录模块会抛出异常:

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 个答案:

答案 0 :(得分:1)

记录处理Unicode值就好了:

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

(写入日志文件将导致UTF-8编码的消息)。

出错的地方是使用str.format()混合字节字符串和Unicode值:

>>> "{}".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"'