【问题标题】:Print succeeds but logging module throws exception打印成功但日志模块抛出异常
【发布时间】:2015-01-24 21:09:44
【问题描述】:

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

这是文件内容:

"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”字符串时,我的其余代码也会抛出类似的异常。

我做错了什么?

【问题讨论】:

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


    【解决方案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"'
    

    【讨论】:

    • 哦!将 unicode 与 ASCII 混合......我现在正在头撞墙(同时打字)。非常感谢。这一定是那些日子之一......我会把它标记为答案。
    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2014-03-31
    • 2012-04-16
    • 2019-05-26
    • 2014-04-27
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多