Edited at

WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話

More than 1 year has passed since last update.

初投稿記事です。

非情報学部からIT業界に就職し、入社から1年がたとうとしている人の記事です。

プログラミング以外にも記事を書いたり説明することも下手ですので、暖かく見守って頂けると幸いです。

何か指摘がございましたらコメントお願いします。


Pythonでファイルのopenができない

現在、業務でPythonを使うことになりそうな状況になっているので、勉強として自宅でプログラムを作成したところ上手くいかなかった部分があったので、備忘録として記事を投稿します。

プログラミング初心者で同じような分部で躓いている方がいらっしゃったら参考にしてください。

当記事では、JSONファイルを対象にしていますが、CSVファイルなどの他のファイルを開いた場合でも同じような現象が起きます。

よければ参考にしてください。


環境

OS :Windows 8.1

言語:Python 3.6.0

Macで開発した方がいいのかもしれませんが、仕事の環境がWindowsだったので、そちらに合わせました。

Pythonのバージョンも、2系を使うか3系を使うか迷いましたが、今後を考えて3系を使うことにしました。

ただ、ネット上では2系のコードが多い印象です。私の場合ネット上でコードをあさることが多いので、3系の基礎的なことを先に学んだ方がいいですね。


プログラムコード

データをJson形式で保存し、Pythonのプログラムから読みだすため、ネット上で色々調べながら以下のコードを記述し実行したところエラーが発生しました。


test.json

 {

"name": "タロー",
"age": 20
}

データは簡単なもので試してみます。


pytest.py

import json

f = open(r'C:\Users\UserName\Desktop\test.json','r')
data = json.load(f)
print(data)


単純にファイルを開いてデコーディング(?)・表示するだけのプログラムです。


実行結果

UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence


初めての私からすると'cp932'????

といった状況でした。

どうやら、デフォルトの場合、文字のコーディングはUTF-8になるのですが、Windows環境を使用しているとデフォルトがcp932でコーディングされるようです。

なので、プログラムにUTF-8でコーディングする様に記述を加えます。


pytest.py

import json

f = open(r'C:\Users\UserName\Desktop\test.json','r',encoding="utf-8")
data = json.load(f)
print(data)


まあ、これなら上手くいくやろ・・・

と思っていましたが、甘かったようです。


実行結果

json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)


今度はUTF-8 BOMってなんだ・・・

これもまた調べてみると、UTF-8ではBOMが付くものとそうでないものがあるようです。

このエラーを解決するためにencodingを"utf-8"から"utf-8_sig"にする必要があるようです。


pytest.py

import json

f = open(r'C:\Users\UserName\Desktop\test.json','r',encoding="utf-8_sig")
data = json.load(f)
print(data)


とりあえず成功を祈りながら実行してみます。


実行結果

{'name': 'タロー', 'age': 20}


表示は成功!!


終わりに

いや~

研修の時は躓いた記憶はないのですが、独学だったりすると無駄に躓くものですね。

こんなのさらっと終わらせるつもりでしたが、解決までに結構時間がかかりました。

初心者の方は、簡単なデータや簡単なプログラムから書き始め、積み上げなが完成にもっていった方がいいと思います。

(経験者の方もそのようにしているかもしれませんが)

私はすんなりいくと思って完成形に近いものを作ってから実行してエラーが出たので、エラーの原因を突き止めるのに結構時間がかかりました。

まだまだ未熟ですね・・・

今後も、私自身の経験の為にも小さい物から記事を書いていきたいと思います。

以上になります。