Help us understand the problem. What is going on with this article?

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

初投稿記事です。
非情報学部から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}

表示は成功!!

終わりに

いや~
研修の時は躓いた記憶はないのですが、独学だったりすると無駄に躓くものですね。
こんなのさらっと終わらせるつもりでしたが、解決までに結構時間がかかりました。

初心者の方は、簡単なデータや簡単なプログラムから書き始め、積み上げながら完成にもっていった方がいいと思います。
(経験者の方もそのようにしているかもしれませんが)

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

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

以上になります。

Yuu94
生命系の学部出身 現在はIT業界でAI, IoTのモック開発をしております。 皆さんに有用な記事を投稿できる様、努めています。 そんなに優秀な人ではないので、アドバイス等お願いします。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした