liquidjumper Python Pythonで日本語を含むjson ファイルを読み書きする方法-MAYA アーティストのスクリプト入門-

Pythonで日本語を含むjson ファイルを読み書きする方法-MAYA アーティストのスクリプト入門-

maya_python_jsonfile_topimage

Pythonでテキストファイルを読み込む方法は以前紹介しました。

jsonファイル自体もテキストファイルなので、他のテキストファイルと同様に
open()で開いて読み込み後に文字列処理をすれば、意図した結果を得られるでしょう。

でも文字処理だけでjsonファイルの内容を取得するのは効率的ではありませんし、そもそもjsonフォーマットの意味が無くなってしまいます。

Python にはjsonフォーマットで書かれたテキストを簡単に扱うことが出来るモジュール「jsonモジュール」が備わっています。

このjsonモジュールを使うことでPythonでjsonファイルを簡単に読み書き利用する事が可能になります。

この記事ではPythonでjsonファイルを扱うことが可能になる「jsonモジュール」の使い方を紹介したいと思います。


jsonファイルとは

jsonファイルは以下のjsonフォーマットで定められた規則に沿って書かれたテキストファイルです。ファイルの拡張子は「.json」

  • 「key:value」を一組にして記述
  • 「key:value」が複数の場合「,」で区切る
  • 「key:value」のまとまりは「{}」で囲む
  • valueには数値・文字列以外にもリスト「[]」や「{key:value,…}」のまとまりもOK


表記が簡単で視認性も高いのでWEBなど様々な分野で使われているデータフォーマットです。

文字コードUTF-8で保存したファイル名「json_file.json」でjsonファイルを作りました。

json_file.json

Pythonのjsonモジュールを使ってjsonファイルを読み込む

jsonファイルは前の項目に書いたようにテキストファイルです。なのでPythonでjosnファイルを開くには他のテキストファイル同様に

open()

関数を使います。


そしてopen()関数で受け取ったFileオブジェクトをjsonモジュールのload()関数で内容を受け取ります。

json.load(Fileオブジェクト)


それでは json.load()を使ってjsonファイルを読んでみたいと思います。

Python3.x系で日本語を含むjsonファイルを読み込む場合

Python3.x系はopen()関数に引数

encoding

で文字コードを指定できるので”utf-8″を指定します。

import json


jsonfile = "D:/liquidJumper/json_file.json"
jsonfile_open = open(jsonfile,"r",encoding="utf-8")
jsonfile_load =json.load(jsonfile_open)

print(jsonfile_load)
jsonfile_open.close()


説明:

jsonfile_open = open(jsonfile,"r",encoding="utf-8")

Python3.x系のopen()関数に文字コード”utf-8″を指定しました。

jsonfile_load =json.load(jsonfile_open)

jsonモジュールのjson.load()でファイル内容を読み込みます。
読み込んだ戻りを変数「jsonfile_load」に代入します。

print(jsonfile_load)

変数「jsonfile_load」に代入された内容を出力

jsonfile_open.close()

Fileオブジェクトを閉じます


結果:

json.load()で読み込むとjsonフォーマットで書かれた内容が、Pythonの辞書形式に変換され読み込まれます。

{‘shizuoka’: ‘YAMAHA’, ‘hiroshima’: ‘マツダ’, ‘aichi’: [‘toyota’, ‘denso’, ‘lixil’], ‘mie’: {‘車’: ‘honda’, ‘紙’: ‘hokuetu’}}


辞書形式で受け取れるので、後はPythonの辞書として処理する事ができとても便利です。

import json


jsonfile = "D:/liquidJumper/json_file.json"
jsonfile_open = open(jsonfile,"r",encoding="utf-8")
jsonfile_load =json.load(jsonfile_open)

print(jsonfile_load["hiroshima"])
print(jsonfile_load["aichi"][1])
jsonfile_open.close()


説明:

print(jsonfile_load["hiroshima"])

“hiroshima”をKeyにして値を取得します

print(jsonfile_load["aichi"][1])

“aichi”をKeyにして値のリストから2番目の要素を取得します。

結果:

“hiroshima”をKeyから「マツダ」、”aichi”をKeyで受け取ったリストの2番目の要素「denso」が出力されました。

マツダ
denso

Python2.x系で日本語を含むjsonファイルを読み込む場合

Python2.x系はopen()関数に文字コードを設定する事が出来ないので、値を受け取るのには工夫が必要です。

# coding:utf-8
import json


jsonfile = "D:/liquidJumper/json_file.json"
jsonfile_open = open(jsonfile,"r")
jsonfile_load =json.load(jsonfile_open)

print(jsonfile_load)
csvfile_open.close()


説明:

jsonfile_open = open(jsonfile,"r")

Python2.x系はopen()関数に文字コードを設定する事が出来ません

結果:

辞書に変換されて読み込まれましたが日本語が「Unicodeエスケープ」で出力されてしまいます。

{u’aichi’: [u’toyota’, u’denso’, u’lixil’], u’mie’: {u’\u7d19′: u’hokuetu’, u’\u8eca’: u’honda’}, u’shizuoka’: u’YAMAHA’, u’hiroshima’: u’\u30de\u30c4\u30c0′}


辞書で受け取った段階では日本語は「u’\u30de」などのUnicodeエスケープになってしまいますが、辞書からKeyを使って値を受け取ってみると問題なく日本語の値を受け取ることが出来ます。

# coding:utf-8
import json


jsonfile = "D:/liquidJumper/json_file.json"
jsonfile_open = open(jsonfile,"r")
jsonfile_load =json.load(jsonfile_open)

print(jsonfile_load["hiroshima"])
csvfile_open.close()


説明:

print(jsonfile_load["hiroshima"])

“hiroshima”をKeyにして値を取得し出力します

結果:

日本語文字列で出力されました。

マツダ


日本語の値は問題なく取得できるは確認できました。
今度はKeyを日本語にして値を受け取ります。

# coding:utf-8
import json


jsonfile = "D:/liquidJumper/json_file.json"
jsonfile_open = open(jsonfile,"r")
jsonfile_load = json.load(jsonfile_open)

print(jsonfile_load)
print(jsonfile_load["mie"][u"車"])
jsonfile_open.close()


説明:

print(jsonfile_load["mie"][u"車"])

辞書「jsonfile_load」からKey「”mie”」で辞書を取得。
取得した辞書からKey「u”車”」で値を取得

結果:

Key「”mie”」で受け取った辞書から日本語のKey「u”車”」で値「honda」を受け取ることが出来ました。

honda

Pythonのjsonモジュールを使ってjsonファイルに書き込む

jsonモジュールを使ってjsonファイルに書き込むには

json.dump(辞書,Fileオブジェクト,ensure_ascii,indent)

を使用します。

Python3.x系で日本語を含むjsonファイルを書き込む場合

import json


jsonfile = "D:/liquidJumper/json_file_new.json"
json_dic = {'aomori':u"りんご","ehime":u"みかん","fukushima":{u"果実":u"もも",u"野菜":u"きゅうり"}}
jsonfile_open = open(jsonfile,"w",encoding="utf-8")
json.dump(json_dic , jsonfile_open , ensure_ascii=False , indent=4)
jsonfile_open.close()


説明:

json_dic = {'aomori':u"りんご","ehime":u"みかん","fukushima":{u"果実":u"もも",u"野菜":u"きゅうり"}}

jsonファイルに書き込む内容を辞書形式で変数「json_dic」に代入します。

jsonfile_open = open(jsonfile,"w",encoding="utf-8")

open()関数でファイルを開きます。モードを”w”、エンコードを”utf-8″に指定。取得したFileオブジェクトを変数「jsonfile_open」に代入します。


json.dump(json_dic , jsonfile_open , ensure_ascii=False , indent=4)

json.dump()でjsonファイルに書き込みます。
第1引数に辞書の変数「json_dic」
第2引数にFileオブジェクト の変数「jsonfile_open」
第3引数で日本語がUnicode変換されないように「ensure_ascii=False」を設定第4引数のindentでインデントの数を指定。josnファイルに書き込まれた内容が読みやすくなります。

jsonfile_open.close()

Fileオブジェクトを閉じる

結果:

jsonファイル「json_file_new.json」が作られました。

json_file_new.json

Python2.x系で日本語を含むjsonファイルを書き込む場合

Python2.x系のopen()関数に文字コードは指定出来ないので、codecsモジュールの

codecs.open()

を使ってjsonファイルのFileオブジェクトを取得します。

# coding:utf-8
import json
import codecs


jsonfile = "D:/liquidJumper/json_file_new.json"
json_dic = {'aomori':u"りんご","ehime":u"みかん","fukushima":{u"果実":u"もも",u"野菜":u"きゅうり"}}
jsonfile_open = codecs.open(jsonfile, 'w', 'utf-8')
json.dump(json_dic , jsonfile_open , ensure_ascii=False , indent=4)
jsonfile_open.close()


説明:

jsonfile_open = codecs.open(jsonfile, 'w', 'utf-8')

open()関数ではなくcodecsモジュールの

codecs.open()

を使います。codecs.open()で文字コード”utf-8″を指定してFileオブジェクトを取得

結果:

Python2系で日本語も問題なくjsonファイル「json_file_new.json」が作る事ができました。

json_file_new.json_python2

まとめ

Pythonでjsonファイルを読み書きする方法を紹介しました。

・Pythonでjsonファイルを読み込むには

open()でFileオブジェクトを取得
取得したFileオブジェクトをjsonモジュールの

json.load()

で読み込む。

・Pythonでjsonファイルに書き込むには

Python3系の場合はopen()でFileオブジェクトを取得
Python2系の場合はcodecs.open()でFileオブジェクトを取得

取得したFileオブジェクトに辞書形式でjsonモジュールの

json.dump(辞書,Fileオブジェクト,ensure_ascii,indent)

で書き込む。


日本語がある場合Python3系とPython2系で多少扱い方が変わり厄介な部分もありますが、jsonフォーマットは「key:value」を一組にした記述でPythonの辞書と同じです。この部分だけでもPythonと非常に相性が良いと感じます。

Pythonで取り扱うデータフォーマットととしてjsonファイルを候補にする場合、jsonモジュールは必須になりるので、しっかり取り扱い方法を覚えることをオススメします。







SAMURAI ENGINEER Plus+


 月額定額制の完全オンライン・プログラミングスクール

 「SAMURAI TERAKOYA(侍テラコヤ)」

 ・月々定額のサブスクで利用でき、入会金も不要、いつでも退会可能
 ・現役エンジニアの講師とマンツーマン・レッスンで疑問や悩みを解決
 ・オンラインで学べるので地方在住者でも受講可能

侍テラコヤ






𝕏 ( 旧Twitter ) Facebook Pocket LINE はてブ

おすすめの関連記事



あわせてよく読まれている記事