Pythonプログラムの設定ファイルとしてJSON形式のファイルを使ってみる

目次

設定ファイル

前回はDjangoで作成したBMI計算アプリをXserverにアップロードしてみました。

今回はこれからこのようにWebアプリやWebサイトを作っていくにあたって使うだろう設定ファイルというものを解説していこうと思います。

設定ファイルとは、例えば読み込むデータはここで、出力するディレクトリはここというような、プログラムが正しく動く上で必要な情報をまとめたファイルのことです。

何故設定ファイルが必要かというと、以下の2点が思い浮かびます。

  1. 自分以外の人が設定を書き換える際、分かりやすくする
  2. 複数のプログラムで同じ設定を使う際、使いまわせるようにする

つまりプログラムを公開する以上、他の人も使う可能性があるわけで、その際に設定ファイルなるものがあれば、プログラム部分はいじらずに安全にその人の環境に合わせることができるということ。

またDjangoのように複数のプログラムが連携して動く場合、それぞれに設定を書き込んでいくと書き込むのも大変ですし、もし修正が必要になった場合、その修正も大変になります。

そのため一つの設定ファイルがあれば、変更場所が分かりやすく、修正するにしても楽だと言うことです。

そのような設定ファイルに関して、フォーマットは色々とあるようです。

Pythonを使っている人にとって、親しみやすいのがpythonプログラムとして設定ファイルを作成する方法だと思います。

この方法では単純に必要な情報を変数に格納したPythonファイルを準備し、その情報が必要なプログラムファイルで設定ファイルをインポートするという方法を取ります。

この方法のデメリットとしては、設定ファイル自身もPythonファイルですので、ディレクトリ構造を見た際にどのファイルが設定ファイルか分かりにくく、またプログラム上でもどのインポート分が設定ファイルを読み込んでいるところか分かりにくいという点が挙げられます。

今回はPythonファイルとして設定ファイルを準備する方法ではなく、最近私が使っているJSONファイルとして設定ファイルを作る方法を解説していきます。

JSONファイル

JSONファイルとは「JavaScript Object Notation」と呼ばれる形式のファイルのことです。

名前に「JavaScript」とあるようにJavaScriptの書き方で書かれたファイルで、データのやり取りに使われるファイル形式の一つです。

今回は設定ファイルとしてのJSONファイルの利用していきますが、実は色々なデータベースサーバーなんかを見てみるとJSON形式のデータを見かけることが多々あります。

ということでここでJSONファイルの取り扱いを覚えておくことで、データベースからのデータの取得なんかもできるようになることでしょう。

さて解説はここまでにしてJSON形式のデータを見てみることにしましょう。

{
    "url":"https://3pysci.com",
    "initial_count":1,
    "searchsite":{
        "yahoo":"https://www.yahoo.co.jp",
        "google":"https://www.google.com/"
    }
}

このようにカギ括弧で囲まれ、辞書形式で格納されたデータがJSON形式です。

辞書形式なので必ず「”キー”:”要素”」というようにキーと要素が組になって書かれています。

ということでこのファイルをJupyter notebookで作成していきましょう。

Jupyter notebookを用いたJSONファイルの作成方法

JSONファイルは先ほど説明したような形式のファイルなだけですので、テキストエディタ(Macの場合はリッチテキストフォーマットでないことに注意)で準備しても構いません。

ただ今後色々とJSON形式の設定ファイルをいじっていくことを考えると、Jupyter notebookで作成し、編集できるようにしておくほうがいいと思います。

ということでまずはJupyter notebook上でJSONファイルの作成をしてみましょう。

Jupyter notebookを起動して、練習用に適当なフォルダに移動してください。

「新規」から「テキストファイル」をクリックします。

上のファイル名である「untitiled.txt」をクリックします。

新しいファイル名として「settings.json」とします。

重要なのは拡張子が「.json」となっていることなので、「settings」の部分はご自由に変更可能です。

次に赤枠の部分にJSON形式で設定内容を記載していきます。

とりあえず先ほど紹介したデータを記入することにしましょう。

{
    "url":"https://3pysci.com",
    "initial_count":1,
    "searchsite":{
        "yahoo":"https://www.yahoo.co.jp",
        "google":"https://www.google.com/"
    }
}

正しいJSON形式であれば、このようにダブルクオーテーションの部分が赤に、数字の部分が緑になります。

もしこのように色分けされていない場合、ファイル名の最後にスペースが入るなどして、JSON形式のファイルだと認識されていない可能性がありますので、ファイル名を今一度ご確認ください。

色分けされている場合はファイルの保存をしてください。

これでJSON形式の設定ファイルができましたので、これをPythonプログラムで読み込んでいきましょう。

JSON形式のファイルをPythonで読み込む方法

JSON形式のファイルを読み込むのは簡単で3ステップでできます。

  1. JSONモジュールのインポート
  2. JSONファイルを通常のファイルとして読み込み
  3. JSON形式として読み込み

プログラムで書くとこうなります。

import json

f_in = open("./settings.json", "r")
settings = json.load(f_in)

「import json」がJSONモジュールのインポート。

「f_in = open(“./settings.json”, “r”)」で先ほど作成した「settings.json」を読み込んで、変数f_inに格納。

「settings = json.load(f_in)」で先ほど読み込んだ「f_in」をJSON形式として読み込み、settingsに格納しています。

それではそれぞれの情報を呼び出してみましょう。

読み込んだJSON形式のデータの呼び出し

JSONは先ほど見た通り辞書形式のファイルになっていますので、必要な情報はキーを使って呼び出すことができます。

print(settings["url"])

実行結果
https://3pysci.com

数字で入力した場合はちゃんとint型として出力されます。

print(settings["initial_count"])
print(type(settings["initial_count"]))

実行結果
1
<class 'int'>

辞書の入れ子もでき、その場合はさらにキーを追加することで要素を取得することができます。

print(settings["searchsite"])
print(settings["searchsite"]["yahoo"])
print(settings["searchsite"]["google"])

実行結果
{'yahoo': 'https://www.yahoo.co.jp', 'google': 'https://www.google.com/'}
https://www.yahoo.co.jp
https://www.google.com/

このように設定項目をかなり簡単に取り出すことができるので便利です。

ただ使っていくのに注意点もあるので、紹介していきます。

注意点1:ダブルクオーテーション

JSON形式でキーや要素を囲うのに使われるのは「ダブルクオーテーション」です。

そして「シングルクオーテーション」ではだめです。

試してみましょう。

{
    'url':'https://3pysci.com',
    "initial_count":1,
    "searchsite":{
        "yahoo":"https://www.yahoo.co.jp",
        "google":"https://www.google.com/"
    }
}

最初の「’url’:’https://3pysci.com’,」の囲いをシングルクオーテーションにしてみました。

これでPythonプログラムからこのJSONファイルを読み込んでみます。

import json

f_in = open("./settings.json", "r")
settings = json.load(f_in)

実行結果
---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-32-01238a67076b> in <module>
      2 
      3 f_in = open("./settings.json", "r")
----> 4 settings = json.load(f_in)
      5 

(中略)

JSONDecodeError: Expecting property name enclosed in double quotes: line 2 column 5 (char 6)

Pythonだと「シングルクオーテーション」と「ダブルクオーテーション」は区別されないので、よくある間違いとなりそうです。

注意点:カンマ

もう一つの注意点としてそれぞれのデータを区切っている「カンマ」があります。

{
    "url":"https://3pysci.com",<-これ
    "initial_count":1,<-これ
    "searchsite":{
        "yahoo":"https://www.yahoo.co.jp",<-これ
        "google":"https://www.google.com/"
    }
}

このカンマですが、適切な位置に入っていないとすぐエラーになります。

必要な場所は「次にデータがある場所」で、つけてはいけない場所は「最後のデータの後」です。

例えば1箇所無くしてみましょう。

ということで「”initial_count”:1」の後のカンマを無くしました。

{
    "url":"https://3pysci.com",
    "initial_count":1
    "searchsite":{
        "yahoo":"https://www.yahoo.co.jp",
        "google":"https://www.google.com/"
    }
}
import json

f_in = open("./settings.json", "r")
settings = json.load(f_in)

実行結果
---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-33-01238a67076b> in <module>
      2 
      3 f_in = open("./settings.json", "r")
----> 4 settings = json.load(f_in)
      5 

(中略)

JSONDecodeError: Expecting ',' delimiter: line 4 column 5 (char 60)

1箇所足りない場合はこんなエラーがでます。

次に最後のデータの後についているパターンも試してみましょう。

今回は最後の”searchsite”のデータの後にカンマを付けてみました。

{
    "url":"https://3pysci.com",
    "initial_count":1,
    "searchsite":{
        "yahoo":"https://www.yahoo.co.jp",
        "google":"https://www.google.com/"
    },
}
import json

f_in = open("./settings.json", "r")
settings = json.load(f_in)

実行結果
---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-35-01238a67076b> in <module>
      2 
      3 f_in = open("./settings.json", "r")
----> 4 settings = json.load(f_in)
      5 

(中略)

JSONDecodeError: Expecting property name enclosed in double quotes: line 8 column 1 (char 169)

とりあえずこの二つは私自身がよく間違えることなので紹介してみました。

これで設定ファイルとしてJSON形式のファイルの作成から読み込み、それぞれの設定データの呼び出しができるようになりました。

JSONファイルへの書き込みもできると思うのですが、設定ファイルへの書き込みはなさそうだと言うことで今回は解説を割愛しました。

ただJSON形式のファイルはデータベースとしても使われているので、また使うようなことがあれば解説したいと思います。

次回はClassの使い方、特にselfを使って、定義した変数を使い回す方法を解説していきます。

ではでは今回はこんな感じで。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる