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) を読み込んでみます.

scores.json の読み込み (prog31.py)
import json

f = open('scores.json', 'r', encoding='utf-8')
scores = json.load(f)
f.close()
print(scores)
[10, 30, 25, 20]

同じ方法で文字列データのリストを読み込むことができます.

names.json の読み込み (prog32.py)
import json

f = open('names.json', 'r', encoding='utf-8')
names = json.load(f)
f.close()
print(names)
['Tanaka', 'Sato', 'Watanabe', 'Takahashi']

辞書形式のデータを読み込む方法も同じです.

novels.json の読み込み (prog33.py)
import json

f = open('novels.json', 'r', encoding='utf-8')
novels = json.load(f)
f.close()
print(novels)
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。',
 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。',
 'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。',
 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'}

辞書が入れ子になった形式でもやはり同様です.

scores2.json の読み込み (prog34.py)
import json

f = open('scores2.json', 'r', encoding='utf-8')
scores = json.load(f)
f.close()
print(scores)
{'Tanaka': {'English': 50, 'Mathematics': 70},
 'Sato': {'English': 60, 'Mathematics': 60},
 'Watanabe': {'English': 30, 'Mathematics': 80},
 'Takahashi': {'English': 80, 'Mathematics': 90}}

辞書のリスト形式でもやはり同様です.

scores3.json の読み込み (prog35.py)
import json

f = open('scores3.json', 'r', encoding='utf-8')
scores = json.load(f)
f.close()
print(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 ファイルであることに注意してください.

output_scores.json の書き出し (prog41.py)
import json

scores = [10, 30, 25, 20]

f = open('output_scores.json', 'w', encoding='utf-8')
json.dump(scores, f)
f.close()
[10, 30, 25, 20]

文字列データのリストをJSONファイルに書き出してみます.

output_names.json の書き出し (prog42.py)
import json

names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']

f = open('output_names.json', 'w', encoding='utf-8')
json.dump(names, f)
f.close()
["Tanaka", "Sato", "Watanabe", "Takahashi"]

上のコードとほぼ同じですが,indent=4 オプションを指定すると,改行とインデントによって整形されます.

output_names_indent.json の書き出し (prog43.py)
import json

names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']

f = open('output_names_indent.json', 'w', encoding='utf-8')
json.dump(names, f, indent=4)
f.close()
[
    "Tanaka",
    "Sato",
    "Watanabe",
    "Takahashi"
]

日本語文字など非ASCII文字を含むデータの場合,文字列がUnicodeエスケープされます.

output_novels_escape.json の書き出し (prog44.py)
import json

novels = {
    'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。',
    'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。',
    'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。',
    'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'
}

f = open('output_novels_escape.json', 'w', encoding='utf-8')
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 オプションを指定すると良いでしょう.

output_novels.json の書き出し (prog45.py)
import json

novels = {
    'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。',
    'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。',
    'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。',
    'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'
}

f = open('output_novels.json', 'w', encoding='utf-8')
json.dump(novels, f, indent=4, ensure_ascii=False)
f.close()
{
    "genji": "どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。",
    "bocchan": "親譲の無鉄砲で小供の時から損ばかりしている。",
    "meros": "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。",
    "rashomon": "ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。"
}

目次に戻る