假设我想在使用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')

但是,这有两个问题:
  • 它在UTF-8字符串文字'São'上引发UnicodeDecodeError。
  • 当CRLF似乎更合适时,输出文件在Windows上具有LF行尾。

  • 但是,如果我根本不通过任何编码,那么我都不会遇到任何问题。这两个字符串都记录到UTF-8文件中,并且得到CRLF行结尾。 (我认为行尾问题与指定编码时以二进制模式打开文件有关。)

    由于省略编码似乎更好,所以是否有某些原因使我错过了encoding='utf-8'的传递?

    最佳答案

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

    请记住,Python 2.x在正确处理字节和Unicode方面并不是理想的选择:在不同的时间发生隐式的编码和解码,这可能会使您失望。在大多数情况下,您实际上不应该将“São”之类的字符串作为字节传递:如果是文本,则应该使用Unicode对象。

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

    关于python - 我应该在我的Python日志记录处理程序中添加='utf-8'编码吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21586655/

    10-16 18:30