python3 の初心者がてこずったので、メモしておく。
(2017.09.26記 2018.11.10書き直し)
対象読者
Windows10にもpython3にも慣れていないが、pythonでloggingモジュールを使いたいぐらいにはpython経験のある人
環境
OS:Windows10
Python処理系: Anaconda4でインストールしたpython3.6.0
おこなったこと
loggingモジュールのFileHandlerオブジェクトに文字コードを指定する。
やりかたは2つある
- 実行するスクリプト内に直接記述する
- loggingモジュールの設定ファイル内に記述する
- 1の例
FileHandler オブジェクトをつくるときの引数に encoding='utf-8' と指定する
from logging import getLogger, FileHandler, Formatter, INFO, WARN
logger = getLogger("logger")
handler = FileHandler(filename="test.log", encoding='utf-8')
handler.setLevel(WARN)
handler.setFormatter(Formatter("%(asctime)s %(levelname)8s %(message)s"))
logger.addHandler(handler)
#出力処理
logger.debug("debug あいうえお")
- 2の例
loggingモジュールの設定ファイルをsample_logging.conf とする。そのなかのfileHandlerの設定を次のようにする
[handler_fileHandler]
class=FileHandler
formatter=simpleFormatter
args=('%(logfilename)s', 'w', 'utf-8')
args= で始まる行が、1の例のFileHandler オブジェクトをつくるときの引数に相当する
この設定ファイルを使うスクリプトは以下のようになるはず。(logging.configを使い設定ファイルを読んでいる)
import logging
import logging.config
if __name__ == '__main__':
logging.config.fileConfig("sample_logging.conf", \
defaults={'logfilename': 'logs/sample.log' })
(蛇足)このメモを書いた理由
Windows でPython3を使うときの常識として
「テキストファイルを作成するとそのファイルの文字コードはWindowsの文字コード(cp932)となるのがデフォルト」
がある。
何も考えずに python3 on windows で次のようなスクリプトを実行すると
# -*- coding: utf-8 -*-# python3 でテキストファイルを出力するテスト
s = 'あいうえお'
with open('tmp.txt', 'w') as f:
f.write(s)
作成されたテキストファイル tmp.txt の文字コードはcp932 となる。
Windowsに慣れていない人はこれをSublimeTextなどで開くと文字化けするので驚く。
(慣れていない人はWindowsのメモ帳は自動判別するので文字化けしないが、SublimeTextなどは自動判別なんてしない、とかいう基本的なことを知らなかったりする)
pythonスクリプトで出力ファイルの文字コードをUTF-8にしたいときは明示的に指定する必要がある。
例えば以下のようにする。
# -*- coding: utf-8 -*-
# python3 でテキストファイルを出力するテスト
import codecs
s = 'あいうえお'
with codecs.open('tmp8.txt', 'w', 'utf-8') as f8:
f8.write(s)
(私は以上のことを知らなかったのでいきなり自作pythonスクリプトのログファイルが文字化けするのを見て???となったのだった。
ネットを検索して初めて知り、なるほど、ではログファイルの出力でも同様の指定をすればよいのだろう、どこでどう指定すればよいのか?となった。
すぐにはピタッとした例がヒットせず、あちこちさまよった末にやりかたがわかったので、ここに結果だけシンプルにメモしておこうと思った次第。)