« ◆光は他を引き付ける重力作用を持つか? | トップページ | 備忘録:cygwinは導入してはならない »

◇PythonでJsonを読むための最重要事項

encoding="utf8"

 Python3でJsonファイルを読み込む場合の最重要事項

Pyhton3でJsonデータファイルを読み込む場合はopen()でencoding="utf8"を指定する必要があります。

# pythonJson.py for json3
import sys                  # コマンド引数を得るためのモジュール
import json                 # json形式を取り扱うモジュール
print("file="+sys.argv[1])
f = open(sys.argv[1],encoding="utf8") # json形式ファイル
data = json.load(f)         # json形式として読み込み
f.close()
print(data)                 # 読み込んだデータを表示してみる
exit() # 終了
これを忘れるとWindowsではjson.loadで次のようなエラーとなります。
file=pythonJson.json.txt
Traceback (most recent call last):
  File "pythonJson.py", line 6, in 
    data = json.load(f)         # json形式として読み込み
  File "C:\Users\XXXXX\AppData\Local\Programs\Python\Python37\lib\json\__init__.
py", line 293, in load
    return loads(fp.read(),
UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 14: illegal
 multibyte sequence

読み込ませたデータは次のものです。

{
   "スポーツ":{
      "球技":["野球","サッカー"],
      "格闘技":["柔道","レスリング"]}}

エラーとなるのはjsonはUTFと決まっているにも関わらず、わざわざ"utf8"を指定してやらないと、Windowsでは一旦cp932として解釈しようとするからです。

ちなみに、正しく動くと次の出力が得られます。

file=pythonJson.json.txt
{'スポーツ': {'球技': ['野球', 'サッカー'], '格闘技': ['柔道', 'レスリング']}}
続行するには何かキーを押してください . . .

最も高い壁といえるencoding="utf8"を超えれば後は左程困難はないと考えています。
結局一番難しいのはこういう論理以外の考えても分かるはずのない部分なのです。

参考までに pythJs.sample.zipにプログラムとデータ、起動バッチファイルを置きました。

なお、起動バッチファイルは次のものです。

@echo off
for %%f in (*.json.txt) do (
   python pythonJson.py %%f
   )
pause

|

« ◆光は他を引き付ける重力作用を持つか? | トップページ | 備忘録:cygwinは導入してはならない »

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/489055/73596860

この記事へのトラックバック一覧です: ◇PythonでJsonを読むための最重要事項:

« ◆光は他を引き付ける重力作用を持つか? | トップページ | 備忘録:cygwinは導入してはならない »