【Python】外部ファイルで設定値を管理する方法まとめ(json,ini,settings.py)

はじめに

どのプログラミング言語でもそうですが、プログラム内部で利用する設定値を外部のファイルに保存して使用する機会がよくあると思います。
設定値の例としては、連携に必要な認証情報などがあります。Twitter APIであれば、Access Tokenなどが挙げられます。
規模が小さい場合は、設定ファイルを作成せずにプログラム内部にそのまま書けばいいですが、ファイルが複数になってきたり、同じ設定値を何度も利用する際に、設定値の変更が必要になった場合に変更漏れが発生する可能性があります。
逆に外部ファイルに設定を持っておけば、そのファイルを修正すれば終わりになるので、その方法についてまとめていきます。
動作環境

 Windows10

 Docker Desktop

 Python 3.11.0

検証環境について

Pythonを利用するにあたって、Dockerに最新のPythonイメージをダウンロードしてコンテナとして起動します。

Dockerのインストール方法は以下の記事で紹介しています。
関連記事

はじめに プログラミングを行う際に実行環境を構築する必要がありますが、普段利用しているローカルPCに直接インストールしてしまっては、トライアンドエラーを繰り返すうちに不要なアプリケーションが積み重なり動作が不安定にな[…]

また、Dockerコンテナはdocker-composeで構築しVSCodeでコマンド操作およびプログラム作成を行っています。
docker-composeの使い方はこちら↓
関連記事

はじめに これまでDockerで仮想環境を作成して開発環境を簡単に構築する方法をまとめてきましたが、実際のサービスとしてプログラミング開発を行うとなった場合にコンテナ一つで進めるのはまれです。 例えば、このブログは[…]

VSCodeのインストール方法はこちら↓
関連記事

はじめに 皆さんはプログラミングを行う際にエディターは何を使っていますでしょうか? 秀丸エディタ?、NotePad++?、サクラエディタ?、それともメモ帳でしょうか? Linuxの人はviやvim、emacsなど[…]

外部ファイルによる設定ファイルについて

はじめにの通り、設定値を外部ファイルにもつ利点はありなるべくそうしたほうが良いのですが、Pythonで設定ファイルを読み込む方法としては3種類あります。

  • JSONファイルを読み込む
  • INIファイルを読み込む
  • Pythonファイルを読み込む

順番に見ていきます。

JSONファイルを読み込む

JSON形式のファイルは汎用性が高く、データを構造的に保持できるので保守性が高いのが特徴です。

設定ファイル(.json)

まずは設定ファイルとしてjsonファイルを用意します。

{
    "int": 100,
    "str": "Hello World!",
    "dic": ["dic1", "dic2"]
}

特徴としては、整数型や文字列型、辞書型など型を指定して設定値を定義できることです。そのため呼び出し先のプログラムでキャスト(型変換)する必要がありません。

Pythonファイル(.json)

それではPythonからjsonでの設定ファイルを呼び出す方法を見てみましょう。

# jsonライブラリをインポート
import json

# jsonファイルを読み込む
appsetting = json.load(open('settings.json', 'r'))

print(appsetting["int"]+1)
print(appsetting["str"])
print(appsetting["dic"])

最初にjsonファイルを扱う際は、jsonライブラリをインポートする必要があります。

5行目でsettings.jsonファイルを読み込んでappsettingという変数に代入しています。

この場合、設定ファイルはソースコードと同じ階層に配置しています。

python json_test.py 
101
Hello World!
['dic1', 'dic2']

型に合わせた内容が出力されていることが確認できます。

INIファイルを読み込む

.iniファイルから設定値を読み込む際は、ConfigPaserというライブラリを利用します。

設定ファイル(.ini)

まずは設定ファイルとして.iniファイルを用意します。

[DEFAULT]
val1 = AAAA
val2 = 100
val3 = ++++

[dev]
val1 = BBBB
val2 = 200
val3 = ----

[prd]
val1 = CCCC

特徴としては、同じ設定項目でも環境依存で値が変わる場合に、グループごとに別の値を設定することができる点です。

今回の例では、DEFAULT、dev、prdという3つのグループで値を設定しています。

DEFAULT以外はすべて定義する必要はなく、定義した設定項目のみ上書きされます。

Pythonファイル(.ini)

それではPythonから.iniでの設定ファイルを呼び出す方法を見てみましょう。

# ConfigParserライブラリをインポート
import configparser

# iniファイルを読み込む
appsetting = configparser.ConfigParser()
appsetting.read('settings.ini')

print('# dev の設定値')
print(appsetting.get('dev', 'val1'))
print(appsetting.get('dev', 'val2'))
print(appsetting.get('dev', 'val3'))

print('# prd の設定値')
prd = appsetting['prd']
print(prd.get('val1'))
print(prd.get('val2'))
print(prd.get('val3'))

最初にiniファイルを扱う際は、ConfigParserライブラリをインポートする必要があります。

5,6行目でsettings.iniファイルを読み込んでappsettingという変数に代入しています。

この場合、設定ファイルはソースコードと同じ階層に配置しています。

appsetting.getの第一引数で取得するグループ名を指定します。第二引数で取得する設定値の項目を指定します。

14行目のように取得したいグループの設定値のみを変数に代入しておくこともできます。

このようにしておくと、設定値を取得する際にグループを指定する必要がなくなります。

python ini_test.py 
# dev の設定値
BBBB
200
----
# prd の設定値
CCCC
100
++++

各グループに設定した設定値が出力されていることが確認できます。

また、prdグループについてはval1についてはprdで設定した値が上書きされて出力されており、val2,val3についてはDEFAULTの値が出力されています。

Pythonファイルを読み込む

.pyファイルから設定値を読み込む方法です。自ら作成した.pyファイルをライブラリとして利用するイメージです。

設定ファイル(.py)

まずは設定ファイルとしてsettings.pyファイルを用意します。

int = 100
str = "Hello World!"
dic = ["dic1", "dic2"]

settingsというClassを作るようなものなので、メンバーとして設定値を定義することができます。

jsonと同じで型を指定して設定することができます。

# settings.pyをインポート
import settings

print(settings.int+1)
print(settings.str)
print(settings.dic)

.pyで設定ファイルを作成する場合は、importするだけで値を使用することができます。

ファイル名が.pyとなるので、他のソースコードと紛らわしい場合もありますが、実際にソースコードの中からは利用しやすいですね。

python py_test.py 
101
Hello World!
['dic1', 'dic2']

まとめ

Pythonでプログラミングを行う際の設定値を別のファイルに定義する方法について3パターンまとめました。
開発規模や構成によってどのパターンを採用するか決定するのが良いですね。
Pythonのプログラミング言語についてより詳しく知りたい方は以下のような書籍を参考にしてみてください。
スッキリわかるPython入門 (スッキリわかる入門シリーズ)
著者:国本大悟 (著), 須藤秋良 (著), 株式会社フレアリンク (監修)
出版社:インプレス
はじめての人・つまずいた人・納得したい人のための入門書。サクサク進めてしくみもバッチリ!プログラミングの「本質」を身に付け未来への道を切り拓こう!業務自動化、データサイエンス、人工知能、アプリ開発プログラマへの第一歩!出典:Amazon
入門 Python 3 第2版
著者:Bill Lubanovic (著), 鈴木 駿 (監修), 長尾 高弘 (翻訳)
出版社:オライリージャパン; 第2版
データサイエンスやウェブ開発、セキュリティなど、さまざまな分野で人気を獲得してきているPython。本書は、ベストセラー『入門 Python 3』の6年ぶりの改訂版で、プログラミング初級者を対象としたPythonの入門書です。プログラミングおよびPythonの基礎から、ウェブ、データベース、ネットワーク、並行処理といった応用まで、実践を見据えたPythonプログラミングをわかりやすく丁寧に説明します。Python 3.9に対応し、f文字列などの新機能も追加され大幅にボリュームアップしました。Pythonの機能をひと通り網羅し、リファレンスとしても便利です。出典:Amazon
たった1日で基本が身に付く! Docker/Kubernetes超入門
著者:伊藤 裕一 (著)
出版社:技術評論社
本書は、次世代のアプリケーションアーキテクチャとして注目されている「マイクロサービス」の技術基盤となるコンテナ技術「Docker」とコンテナオーケストレーション技術「Kubernetes」を取り上げ、Dockerの基本的な利用法、DockerfileやComposeの設計、コンテナのデータ永続化やCI/CD、Kubernetesによる複数コンテナの自動管理までを、一気に学習します。出典:Amazon