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

2024-06-20 15:15:55 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想在使用Python2.7进行日志记录时处理Unicode字符串。将编码参数添加到文件处理程序似乎“正确”。

# 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')

不过,这有几个问题:

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

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

既然省略编码似乎更有效,那么我是否有什么原因会漏掉来传入encoding='utf-8'


Tags: 文件字符串处理程序编码参数logging记录unicode
1条回答
网友
1楼 · 发布于 2024-06-20 15:15:55

如果将编码传递给FileHandler,则它使用codecs.open()与该编码一起打开文件;否则,它使用纯open()。这就是encoding的全部用途。

请记住,Python2.x在正确处理字节和Unicode方面并不理想:在不同的时间会发生隐式编码和解码,这可能会让您遇到麻烦。在大多数情况下,您不应该将“São”这样的字符串作为字节传递:如果是文本,则应该使用Unicode对象。

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

相关问题 更多 >