我创建了一个写入文本文件的记录器:
import logging
logger_dbg = logging.getLogger("dbg")
logger_dbg.setLevel(logging.DEBUG)
fh_dbg_log = logging.FileHandler('debug.log', mode='w', encoding='utf-8')
fh_dbg_log.setLevel(logging.DEBUG)
# Print time, logger-level and the call's location in a source file.
formatter = logging.Formatter(
'%(asctime)s-%(levelname)s(%(module)s:%(lineno)d) %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
fh_dbg_log.setFormatter(formatter)
logger_dbg.addHandler(fh_dbg_log)
logger_dbg.propagate = False
当我想记录一些信息时,我称之为记录器:
^{pr2}$问题是写入的日志文件debug.log
使用一个换行符(LF)作为换行符,尽管我在Windows 7(64位)上运行此程序:
2015-11-30 12:39:08-DEBUG(SerialThread:196) Closing port... 2015-11-30 12:39:08-DEBUG(SerialThread:198) Port closed.
奇怪的是,如果我不使用encoding='utf-8'
参数设置记录器的文件句柄,换行符将正确地写入CR/LF。在
为什么将编码设置为UTF-8会导致Python使用不正确的换行符?在
指定编码时,^{} 将被使用,而不是常规的
open()
调用。此函数总是以二进制模式打开文件,并在此基础上实现编码。这样它就可以保证任何编解码器都能工作,而不仅仅是基于ASCII的编解码器。这种选择的一个副作用是在Windows上新行不再被翻译成平台约定!在您可以提交一个bug来修复这个问题,一个更好的解决方案是使用^{} ;
io
模块是新的Python3 I/O框架,后移植到Python2,它可以更好地处理文本模式,包括在Windows上正确地处理换行。在您可以修补
logging.FileHandler._open
方法来本地修复此问题:FileHandler.emit()
方法也需要修补,否则Unicode消息首先被编码为UTF-8,但是io.open()
文件对象只接受Unicode对象。在相关问题 更多 >
编程相关推荐