Python入門トップページ


目次

  1. コマンドラインでの実行時に書き出す
  2. プログラム内でのファイルの入出力
    1. ファイルに出力する
    2. ファイルに追記する
    3. ファイルを読み込む
    4. ファイルを読み込んで文字列として変数に格納する
    5. ファイルから数値を読み込む
    6. ファイルから数値を読み込みリストに格納する
  3. OSの違いを吸収するディレクトリ指定方法
  4. JSONファイルの読み込みと書き出し
    1. JSONファイルの作成
    2. JSONファイルの読み込み
    3. JSONファイルの書き出し

ファイルの読み書きをしてみよう

JSONファイルの読み込みと書き出し

JSONファイルの作成

まずは,秀丸エディタや 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ファイルを扱うためには,プログラムの先頭で 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ファイルの書き出し

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": "ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。"
}

目次に戻る