あるシステムのログを解析したいと思い、勉強のためにPythonで解析用のコードを作ることにしました。
しかしながら文字コード関連のエラーに躓いてしまいました。
今後、同じようなことが起こるかもしれないため、メモを残しておきます。
Python3のWindows環境です。
#UnicodeDecodeErrorと遭遇
以下のファイル読み出し後に文字列解析を試みるとUnicodeDecodeErrorと遭遇してしまいました。
最初のコード
infile = open(file, 'r')
実行結果
Traceback (most recent call last):
File "result_checker.py", line 14, in <module>
for line in infile:
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 2642: illegal multibyte sequence
Windows環境ではデフォルトだとcp932がデフォルトのエンコーディングが使用されるようです。
今回のログはUTF-8で保存されているため、エンコーディングにUTF-8指定を追加してみました。
次のコード
infile = open(file, 'r',encoding="utf-8")
実行結果
Traceback (most recent call last):
File ".\log\result_checker.py", line 14, in <module>
for line in infile:
File "C:\Python34\lib\codecs.py", line 313, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 6567: invalid start byte
少し動いた形跡はあったのですが、まだエラーが。。。
どうやらシステムの出力特性上、デコードできない文字が含まれているようです。
調べたところ、errors=
で入力文字列に対し変換ができなかったときの対応方法を指定できるようです。
'ignore'を指定すると「結果となる Unicode から単に文字を除く」ということができます。
今回はそれで十分なのでerrors='ignore'
を指定しました。
動作したコード
infile = open(file, encoding="utf8", errors='ignore')
これで何とか読めるようになりました。