【記事の内容】
・Pythonで設定ファイル【.ini】を作って操作する方法を解説します!
・これにより、プログラム実行中に発見した良いパラメータなどを自動で保存しましょう!
・以上をGoogleColabにも対応しながら解説します!
これで複雑な設定値を一発で保存する方法をマスターしましょう!
本記事で出来るようになること
【先にコードをお見せしますね!】
# 設定ファイルを扱うモジュールをインポート
import configparser
# ConfigParserのインスタンス(特定の機能を持った変数)を取得
config = configparser.ConfigParser()
# 用意したconfig_1.iniを読み出し
config.read("config_1.ini")
# 変数Config_1の中から、"BASE"セクションの"speed"と"weight"項目の内容を取り出し
cfg_read_1 = config["BASE"]["speed"]
cfg_read_2 = config["BASE"]["weight"]
# 変数の内容を出力
print("cfg_read_1 =", cfg_read_1)
print("cfg_read_2 =", cfg_read_2)
# 変数の内容を変更
cfg_read_1 = int(cfg_read_1) + 100
cfg_read_2 = int(cfg_read_2) + 40
# configの各項目に上書き
config["BASE"]["speed"] = str(cfg_read_1)
config["BASE"]["weight"] = str(cfg_read_2)
# config_1.iniファイルに上書き
with open("config_1.ini", "w") as file:
config.write(file)
さぁ、いってみましょう!
準備
設定ファイル【.ini】の作成
[BASE]
speed = 100
weight = 60
初めに、これがPythonの設定アイルの基本形となります。(内容は後で説明します)
これを新規で開いたメモ帳にコピーして、任意の名前で保存してください。
保存したら、名前を“.txt”を含めて消去して,“ config_1.ini ” という名称に変更してください。
その際、『拡張子を変更すると、ファイルが使えなくなる可能性があります。変更しますか?』と注意されますので、“はい”を選んでください。
名前が無事に変わり、ファイルの種類が“構成設定”になったらOKです。
設定ファイルを置く場所
お作り頂いた“ config_1.ini ”は、ご自分のPCの場合は実行ファイルと同じフォルダの中(同階層)に入れて頂き、Google Colabで行う方は、以下の場所に入れてください。
(2パターンありますが、結果的に同じ場所へ入れています)
設定ファイルの読み込み
それでは早速、作った設定ファイルの読み込み行いましょう。
以下のコードを実行して、結果を確かめてみてください。
# 設定ファイルを扱うモジュールをインポート
import configparser
# ConfigParserのインスタンス(特定の機能を持った変数)を取得
config = configparser.ConfigParser()
# 用意したconfig_1.iniを読み出し
config.read("config_1.ini")
# 変数Config_1の中から、"BASE"セクションの"speed"と"weight"項目の内容を取り出し
cfg_read_1 = config["BASE"]["speed"]
cfg_read_2 = config["BASE"]["weight"]
# 変数の内容を出力
print("cfg_read_1 =", cfg_read_1)
print("cfg_read_2 =", cfg_read_2)
【結果】
cfg_read_1 = 100
cfg_read_2 = 60
先ほど“config_1.ini”に記載した値が出力されたと思います。
後半の章でコードごとの解説はしますが、ここでは読み出す部分のコードの構造を図示しますので参考にしてみてください。
読み出し部分の構造
設定ファイルへの書き込み
それでは書き込みを行いましょう。
先ほどのコードの下に、以下のコードを追加して、実行してください。
# 変数の内容を変更
cfg_read_1 = int(cfg_read_1) + 100
cfg_read_2 = int(cfg_read_2) + 40
# configの各項目に上書き
config["BASE"]["speed"] = str(cfg_read_1)
config["BASE"]["weight"] = str(cfg_read_2)
# config_1.iniファイルに上書き
with open("config_1.ini", "w") as file:
config.write(file)
実行したら、“config_1.ini”の中身を見てみましょう。
PCの方も、GoogleColabの方も、ファイルをダブルクリックで開けます。
さて、以下のように値が変化したでしょうか。
[BASE]
speed = 200 # もとは100
weight = 100 # もとは60
これで設定ファイルの書き換えができましたね。
以上のコードとiniファイル中の項目を任意の名前に書きかえれば、ご自分の設定ファイルをつくることができます。
読み込み・書き込み共に、【config[“BASE”][“speed”]】の部分の構造は変わりませんので、これを変数の右辺に持ってくれば読み込み、 左辺に持ってくれば書き込みとなります。
【変数 = config[“BASE”][“speed”]】:読み込み
【 config[“BASE”][“speed”] = 変数】:書き込み
※読み込みも書き込みも、型は“str”です!!
筆者のコードを参考にすれば、そのまま型変換されますでご活用ください!
コード解説
モジュールのインポート
# 設定ファイルを扱うモジュールをインポート
import configparser
今回使用したのは【configparser】というモジュールで、本題どおり、設定ファイルを管理するモジュールです。
インスタンスを取得
# ConfigParserのインスタンス(特定の機能を持った変数)を取得
config = configparser.ConfigParser()
ここで【configparser】の機能をインスタンスとして獲得します。
変数【config】は、以降 configparser の持つ機能を自身も持つことになります。
ファイルおよび内容の読み込み
# 用意したconfig_1.iniを読み出し
config.read("config_1.ini")
# 変数Config_1の中から、"BASE"セクションの"speed"と"weight"項目の内容を取り出し
cfg_read_1 = config["BASE"]["speed"]
cfg_read_2 = config["BASE"]["weight"]
# 変数の内容を出力
print("cfg_read_1 =", cfg_read_1)
print("cfg_read_2 =", cfg_read_2)
設定ファイルの操作機能を獲得した変数【config】は、まず【read】機能を使って、設定ファイル“config_1.ini”を読み込みます。
そして、ファイルの内容を取得した【config】の中から、[“BASE”]セクション内の[“speed”]項目の内容を取得します。[“weight”]も同様です。
内容の上書き(プログラム内のみ)
# 変数の内容を変更
cfg_read_1 = int(cfg_read_1) + 100
cfg_read_2 = int(cfg_read_2) + 40
# configの各項目に上書き
config["BASE"]["speed"] = str(cfg_read_1)
config["BASE"]["weight"] = str(cfg_read_2)
先程取得した値を入れた変数に、任意の値を足して、変数に上書きしています。
計算前に【int()】でstr型を整数に変換することを忘れないでください。
各項目に上書きする時はその逆で、【str()】を使い、文字列に戻しています。
しかしここまででは、まだ“設定ファイルからコピーした情報に上書きしただけ”なので、次項でファイルに上書きしましょう。
ファイルに上書き
# config_1.iniファイルに上書き
with open("config_1.ini", "w") as file:
config.write(file)
最後に用意した設定ファイルへ上書きします。
【config.write(引数)】で、引数にて指定されたファイルへ上書きを行います。
ちなみに、このwithから始まるコードは、“with構文”とも呼ばれ、ファイルを操作する時に多用されるものです。
具体的には、ファイル操作のコードを短縮でき、更には、開いたファイルの閉じ忘れを防いでくれるものになります。
たいへん便利で安全性を高めるので、この類の処理では是非使いましょう!
最後に
Pythonによる設定ファイルの操作、いかがでしたでしょうか。
画像処理や機械学習など複雑なプログラムを実行していると、ふと、重要なパラメータ(設定値)が出てくるものです。
そういった重要な値の記録さえも、Python自身で行えることを本記事でご理解頂ければ幸いです。
それでは、また次回お会いしましょう!