まずは,秀丸エディタや Visual Studio Code, Atom などのテキストエディタを使って JSON ファイルを作成し,Python プログラムと同じフォルダに保存します.次の scores.json ファイルは整数データのリスト形式です.
リスト形式のJSONファイル (scores.json)
[10, 30, 25, 20]
文字列データのリストも同じ様に作成します.このとき,上の scores.json のように1行にまとめて記述できるが,次のように改行やインデントを用いて整形しても良いでしょう.
リスト形式のJSONファイル (names.json)
[
"Tanaka",
"Sato",
"Watanabe",
"Takahashi"
]
辞書形式のデータは次のような JSON ファイルとして保存すると良いでしょう.
辞書形式のJSONファイル (novels.json)
{
"genji" : "どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。",
"bocchan" : "親譲の無鉄砲で小供の時から損ばかりしている。",
"meros" : "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。",
"rashomon" : "ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。"
}
次のデータ scores2.json は辞書(キー:値)の「値」がさらに辞書になっている形式です.
リスト形式のJSONファイル (scores2.json)
{
"Tanaka": {
"English": 50,
"Mathematics": 70
},
"Sato": {
"English": 60,
"Mathematics": 60
},
"Watanabe": {
"English": 30,
"Mathematics": 80
},
"Takahashi": {
"English": 80,
"Mathematics": 90
}
}
次のデータ scores3.json はリストの個々のデータが辞書になっている形式です.
リスト形式のJSONファイル (scores3.json)
[
{
"Name": "Tanaka",
"English": 50,
"Mathematics": 70
},
{
"Name": "Sato",
"English": 60,
"Mathematics": 60
},
{
"Name": "Watanabe",
"English": 30,
"Mathematics": 80
},
{
"Name": "Takahashi",
"English": 80,
"Mathematics": 90
}
]
上で作成した JSON ファイルを読み込みたい.JSONファイルを扱うためには,プログラムの先頭で JSON ライブラリをインポートします.
ライブラリのインポート
import json
ファイルを読み込む手順はここで説明した方法とほぼ同様です.具体的には open()
でファイルを開き,json.load()
でJSONファイルを読み込んでリストや辞書に格納します.最後に close()
でファイルを閉じると良いでしょう.まずは,整数のリスト (scores.json) を読み込んでみます.
f = open('scores.json', 'r')
scores = json.load(f)
f.close()
scores
[10, 30, 25, 20]
同じ方法で文字列データのリストを読み込むことができます.
f = open('names.json', 'r')
names = json.load(f)
f.close()
names
['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
辞書形式のデータを読み込む方法も同じです.
f = open('novels.json', 'r')
novels = json.load(f)
f.close()
novels
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'}
辞書が入れ子になった形式でもやはり同様です.
f = open('scores2.json', 'r')
scores = json.load(f)
f.close()
scores
{'Tanaka': {'English': 50, 'Mathematics': 70}, 'Sato': {'English': 60, 'Mathematics': 60}, 'Watanabe': {'English': 30, 'Mathematics': 80}, 'Takahashi': {'English': 80, 'Mathematics': 90}}
辞書のリスト形式でもやはり同様です.
f = open('scores3.json', 'r')
scores = json.load(f)
f.close()
scores
[{'Name': 'Tanaka', 'English': 50, 'Mathematics': 70}, {'Name': 'Sato', 'English': 60, 'Mathematics': 60}, {'Name': 'Watanabe', 'English': 30, 'Mathematics': 80}, {'Name': 'Takahashi', 'English': 80, 'Mathematics': 90}]
JSONファイルを書き出す手順も通常のファイルを書き出す手順とほぼ同様です.ここで write()
を使った代わりに,json.dump()
を使います.また,あらかじめ json ライブラリをインポートしておく必要もあります.出力先はもちろん画面ではなく output.json ファイルであることに注意してください.
import json
scores = [10, 30, 25, 20]
f = open('output.json', 'w')
json.dump(scores, f)
f.close()
[10, 30, 25, 20]
文字列データのリストをJSONファイルに書き出してみます.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
f = open('output.json', 'w')
json.dump(names, f)
f.close()
["Tanaka", "Sato", "Watanabe", "Takahashi"]
上のコードとほぼ同じですが,indent=4
オプションを指定すると,改行とインデントによって整形されます.
names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
f = open('output.json', 'w')
json.dump(names, f, indent=4)
f.close()
[ "Tanaka", "Sato", "Watanabe", "Takahashi" ]
日本語文字など非ASCII文字を含むデータの場合,文字列がUnicodeエスケープされます.
novels = {
'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。',
'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。',
'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。',
'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'
}
f = open('output.json', 'w')
json.dump(novels, f, indent=4)
f.close()
{ "genji": "\u3069\u306e\u5929\u7687\u69d8\u306e\u5fa1\u4ee3\u3067\u3042\u3063\u305f\u304b\u3001\u5973\u5fa1\u3068\u304b\u66f4\u8863\u3068\u304b\u3044\u308f\u308c\u308b\u5f8c\u5bae\u304c\u304a\u304a\u305c\u3044\u3044\u305f\u4e2d\u306b\u3001\u6700\u4e0a\u306e\u8cb4\u65cf\u51fa\u8eab\u3067\u306f\u306a\u3044\u304c\u6df1\u3044\u5fa1\u611b\u5bf5\u3092\u5f97\u3066\u3044\u308b\u4eba\u304c\u3042\u3063\u305f\u3002", "bocchan": "\u89aa\u8b72\u306e\u7121\u9244\u7832\u3067\u5c0f\u4f9b\u306e\u6642\u304b\u3089\u640d\u3070\u304b\u308a\u3057\u3066\u3044\u308b\u3002", "meros": "\u30e1\u30ed\u30b9\u306f\u6fc0\u6012\u3057\u305f\u3002\u5fc5\u305a\u3001\u304b\u306e\u90aa\u667a\u66b4\u8650\u306e\u738b\u3092\u9664\u304b\u306a\u3051\u308c\u3070\u306a\u3089\u306c\u3068\u6c7a\u610f\u3057\u305f\u3002", "rashomon": "\u3042\u308b\u65e5\u306e\u66ae\u65b9\u306e\u4e8b\u3067\u3042\u308b\u3002\u4e00\u4eba\u306e\u4e0b\u4eba\u304c\u3001\u7f85\u751f\u9580\u306e\u4e0b\u3067\u96e8\u3084\u307f\u3092\u5f85\u3063\u3066\u3044\u305f\u3002" }
非ASCII文字をエスケープせずに書き出したい場合は,ensure_ascii=False
オプションを指定すると良いでしょう.
novels = {
'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。',
'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。',
'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。',
'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'
}
f = open('output.json', 'w')
json.dump(novels, f, indent=4, ensure_ascii=False)
f.close()
{ "genji": "どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。", "bocchan": "親譲の無鉄砲で小供の時から損ばかりしている。", "meros": "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。", "rashomon": "ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。" }
なお,macOS では上のコードを実行したときに文字コードを指定しなくとも UTF-8 で保存されます.一方で,Windows 環境では Shift-JIS で出力されるはずです.Windows 環境でも UTF-8 で出力するには,次の通り codecs
をインポートして利用するとよいでしょう.また,次のコードは macOS でも動作するので,両方の環境で動作させることが考えられる場合は macOS でも codecs
を利用しておくと良いかもしれません.
import codecs
f = codecs.open('output.json', 'w', 'utf-8')
json.dump(novels, f, indent=4, ensure_ascii=False)
f.close()
{ "genji": "どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。", "bocchan": "親譲の無鉄砲で小供の時から損ばかりしている。", "meros": "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。", "rashomon": "ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。" }
このページのこれまでのコード群のように open()
で開いたファイルは利用を終えたあとに忘れずに close()
で閉じなければなりません.前のページでの説明と同様に,with
を使うとそのブロックの処理が終わった段階で自動的にファイルが閉じられます.
with codecs.open('output.json', 'w', 'utf-8') as f:
json.dump(novels, f, indent=4, ensure_ascii=False)