我应该在我的Python日志处理程序中添加encoding ='utf-8'吗?

Eri*_*ith 9 python logging utf-8

假设我在使用Python 2.7进行日志记录时想要处理Unicode字符串.将编码参数添加到FileHandler似乎"正确".

# coding=utf-8
import logging

logger = logging.getLogger()
logger.addHandler(logging.FileHandler('my_log.txt', encoding='utf-8'))

logger.error(u'Pão')
logger.error('São')
Run Code Online (Sandbox Code Playgroud)

但是这有几个问题:

  1. 它在UTF-8字符串文字"São"上引发UnicodeDecodeError.
  2. 当CRLF看起来更合适时,输出文件在Windows上有LF行结尾.

但是,如果我根本没有传递任何编码,我就没有这些问题.两个字符串都记录到UTF-8文件中,我得到CRLF行结尾.(我认为当指定编码时,行结束问题与二进制模式下的文件打开有关.)

由于省略了编码似乎更好地工作,是有一些原因,我缺少的我会永远传递encoding='utf-8'

Vin*_*jip 2

如果您将编码传递给FileHandler,它会使用codecs.open()该编码来打开文件;否则,它使用 plain open()。这就是所有的encoding用途。

\n\n

请记住,Python 2.x 在正确处理字节和 Unicode 方面并不理想:在不同时间会发生隐式编码和解码,这可能会让您陷入困境。在大多数情况下,您确实不应该将像 'S\xc3\xa3o' 这样的字符串作为字节传递:如果它是文本,您应该使用 Unicode 对象。

\n\n

至于行结尾 - 这通常由 Python 的文件 I/O 机制转换为特定于平台的行结尾。但如果codecs.open()使用,则底层文件将以二进制模式打开,因此不会像 Windows 上那样进行 to\\n的转换。\\r\\n

\n