loggingモジュールがうまく動作しない。
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')
def factorial(n):
logging.debug('factorial({})開始'.format(n))
total = 1
for i in range(1, n + 1):
total *= i
logging.debug('i = {}, total = {}'.format(i, total))
logging.debug('factorial({})終了'.format(n))
return total
print(factorial(5))
logging.debug('プログラム終了')
このプログラムはメソッドの中でログを取ることによってプログラムがどのように動いているかを把握するためのテストプログラムです。ログの役割についてはなんとなく理解できてきました。「退屈なことはpythonにやらせよう」という書籍をもとに進めています。
しかしこのプログラムを実行すると・・・↓
runfile('C:/Users/sugimoto/Desktop/atom作業フォルダ/python/プログラム/ログを取る.py', wdir='C:/Users/sugimoto/Desktop/atom作業フォルダ/python/プログラム')
120
--- Logging error ---
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 992, in emit
msg = self.format(record)
File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 838, in format
return fmt.format(record)
File "C:\ProgramData\Anaconda3\lib\logging\__init__.py", line 578, in format
s = self.formatMessage(record)
以下に膨大なメッセージが表示され、フォーマット通りの結果が返ってきません。コードは間違っていないと思うのですが、どこかにミスがあるのでしょうか?
コメントアドバイスを受けファイル名を修正しました
1. ログを取る.py → Logging error
2. logは.py → 成功
3. ログをとる.py → 成功
4. ログを取る.py → 成功(最初にエラーがでていたファイル名に戻してもうまくいった。)
runfile('C:/Users/sugimoto/Desktop/atom作業フォルダ/python/プログラム/ログを取る.py', wdir='C:/Users/sugimoto/Desktop/atom作業フォルダ/python/プログラム')
2017-11-16 13:19:59,744 - DEBUG - factorial(5)開始
2017-11-16 13:19:59,746 - DEBUG - i = 1, total = 1
2017-11-16 13:19:59,747 - DEBUG - i = 2, total = 2
2017-11-16 13:19:59,747 - DEBUG - i = 3, total = 6
2017-11-16 13:19:59,748 - DEBUG - i = 4, total = 24
2017-11-16 13:19:59,749 - DEBUG - i = 5, total = 120
2017-11-16 13:19:59,749 - DEBUG - factorial(5)終了
2017-11-16 13:19:59,750 - DEBUG - プログラム終了
120
エラーが発生した原因に仮説をたてました
- 開発環境はspyderでプログラムの先頭に# -- coding: utf-8 --を書かずに保存していたことにきづきました。
- 結果shiftjisか何かで読み込んだ結果エラーが発生した。
- その後ファイル名の変更はファイルエディタのatomで変更した。
- 結果、ファイルはutf-8の文字コードで保存されることになった
- そのため同じ名前のファイル名でもプログラムが正常に動いた
これは仮説ですが、たぶんこんな感じです。spyderはあまり使いなれていないこともあり、atomでファイル名を変更しました。atomは学習のメモ用にも使っているので、いつも両方使用しております。atomには「auto encoding」というパッケージが入っているで、atomで名前を変えたときに文字コードが変わったのではないかと思います。
spyderは新規ファイル作成時に 「# -- coding: utf-8 --」と書かれた状態で作成されるのですが、今回はなぜかそれを消していました。
(ながながと失礼します)