2014-02-05 28 views
7

假设我想在使用Python 2.7进行日志记录时处理Unicode字符串。将编码参数添加到FileHandler似乎是“正确的”。我应该在我的Python日志处理程序中添加encoding ='utf-8'吗?

# 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. 它提出了一个UnicodeDecodeError错误的UTF-8字符串字面'骚。
  2. 的输出文件在Windows LF行结束,当CRLF似乎更为合适。

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

由于省略编码似乎工作得更好,是否有某种原因我错过了,我会曾经通过encoding='utf-8'

回答

2

如果传递了编码FileHandler,它使用codecs.open()与编码打开文件;否则,它使用普通的open()。这就是所有的encoding用于。

回想一下,Python 2.x的是不正确处理字节和Unicode的理想:有这种情况发生在不同的时间,可你绊倒隐性编码和解码。在大多数情况下,你不应该像字符串一样传递字符串:如果是文本,你应该使用Unicode对象。

而对于行结束 - 这通常翻译成由文件Python的I/O机器的特定于平台的行尾。但是,如果使用codecs.open(),那么底层的文件是以二进制模式打开,因此没有\n\r\n翻译发生时,它通常会在Windows上。

相关问题