假设我想在使用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')
不过,这有几个问题:
但是,如果我根本不传递任何编码,我就没有这些问题。两个字符串都被记录到一个UTF-8文件中,我得到CRLF行尾。(我认为行结束问题与指定编码时以二进制模式打开文件有关。)
既然省略编码似乎更有效,那么我是否有什么原因会漏掉来传入encoding='utf-8'
?
如果将编码传递给
FileHandler
,则它使用codecs.open()
与该编码一起打开文件;否则,它使用纯open()
。这就是encoding
的全部用途。请记住,Python2.x在正确处理字节和Unicode方面并不理想:在不同的时间会发生隐式编码和解码,这可能会让您遇到麻烦。在大多数情况下,您不应该将“São”这样的字符串作为字节传递:如果是文本,则应该使用Unicode对象。
至于行尾-这通常由Python的文件I/O机器转换为特定于平台的行尾。但是,如果使用
codecs.open()
,那么底层文件将以二进制模式打开,因此不会发生\n
到\r\n
的转换,就像在Windows上一样。相关问题 更多 >
编程相关推荐