1: 2016-12-24 (土) 09:14:21 njf |
現: 2016-12-24 (土) 20:29:06 njf |
- | *設定ファイルの読み込み [#ie4f9869] | + | *導入 [#b8056944] |
| + | Pythonでプログラムしていると、数個程度のパラメーターなら引数で与えた方が楽なのですが、数が増えたり長いパラメーターがあるといろいろな設定を外部ファイルにしたいことが良くあります。 |
| + | |
| + | 自前でフォーマットを作っても良いのですが、ちょっとした書式の違いで動かなくなったりと、意外に面倒なので、すでにあるものを使うのが無難です。 |
| + | |
| + | ここではPythonにデフォルトで入っている設定ファイル読み込みのモジュール、ConfigParserを使った設定ファイルの読み込みをご紹介します。 |
| + | |
| + | *設定ファイルの準備 [#ie4f9869] |
| 以下のような設定ファイル「test.setting」を読み込むとします。 | | 以下のような設定ファイル「test.setting」を読み込むとします。 |
| | | |
| #設定ファイル | | #設定ファイル |
| + | |
| [numbers] | | [numbers] |
| setting_number_1 = 123 | | setting_number_1 = 123 |
| setting_number_2 = 99.999 | | setting_number_2 = 99.999 |
| + | |
| [strings] | | [strings] |
- | setting_str_1 = "string1" | + | setting_str_1 = string1 |
- | setting_str_2 = "文字列2" | + | setting_str_2 = 文字列2 |
| + | |
| + | [other] |
| + | setting_bool = true |
| | | |
| 「#」で始まる行はコメントとして無視されます。 | | 「#」で始まる行はコメントとして無視されます。 |
- | 「[]」で囲まれた部分はセクション名で、ないとセクションが要らないときでも入れておきましょう。 | + | 「[]」で囲まれた部分はセクション名で、ないとエラーとなります。セクションが要らないときでも入れておきましょう。 |
| 空白などは自由に入れることができます。 | | 空白などは自由に入れることができます。 |
| + | |
| + | 文字列に引用符は必要なく、空白があっても右辺全てが出力されます。 |
| + | |
| + | 真偽型は「True」「true」「False」「false」、「1」(Trueの意)、「0」(Falseの意)などが認識されます。 |
| + | |
| + | *値の読み込み [#yfa71428] |
| + | このファイルの「numbers」セクションの「setting_number_1」を読み込むには以下のようにします。 |
| + | |
| + | import ConfigParser |
| + | |
| + | settingFile = ConfigParser.SafeConfigParser() |
| + | |
| + | settingFile.read("test.setting") |
| + | |
| + | settingNumber1 = settingFile.get("numbers","setting_number_1") |
| + | |
| + | print settingNumber1 |
| + | print type(settingNumber1) |
| + | |
| + | ConfigParserには「RawConfigParser」、「ConfigParser」、「SafeConfigParser」の3つのオブジェクトがあり、この順で機能が拡張されています。なので通常は一番多機能な「SafeConfigParser」を使っておけばあとで機能追加もしやすく無難です。 |
| + | |
| + | この実行結果は、 |
| + | 123 |
| + | <type 'str'> |
| + | |
| + | となります。getを使うとstr型で返されます。 |
| + | |
| + | **数値の読み込み [#u51bd31d] |
| + | |
| + | intやfloatで結果を取りたいときには以下のように専用のメソッドを使います。 |
| + | |
| + | settingNumber1 = settingFile.getint("numbers","setting_number_1") |
| + | |
| + | print settingNumber1 |
| + | print type(settingNumber1) |
| + | |
| + | settingNumber2 = settingFile.getfloat("numbers","setting_number_2") |
| + | |
| + | print settingNumber2 |
| + | print type(settingNumber2) |
| + | |
| + | 結果 |
| + | 123 |
| + | <type 'int'> |
| + | 99.999 |
| + | <type 'float'> |
| + | |
| + | 型が決まっている場合にはこちらの方が便利です。 |
| + | だだし、書式がintやfloatと解釈できない物だとエラーになります。 |
| + | |
| + | 読み込んでからその内容によって型を決めるような場合にはgetでひとまずstrとして読んでから変換する方が便利です。 |
| + | |
| + | **文字列の読み込み [#xf2ab3aa] |
| + | |
| + | 文字列の場合はすでに紹介したようにgetで読み込みます。 |
| + | |
| + | settingStr1 = settingFile.get("strings","setting_str_1") |
| + | print settingStr1 |
| + | print type(settingStr1) |
| + | |
| + | settingStr2 = settingFile.get("strings","setting_str_2") |
| + | print settingStr2 |
| + | print type(settingStr2) |
| + | |
| + | 結果 |
| + | string1 |
| + | <type 'str'> |
| + | 文字列2 |
| + | <type 'str'> |
| + | |
| + | となります。 |
| + | このとき日本語などを利用するなら、設定ファイルをUTF8にしておきましょう。 |
| + | [[Python]] ver2系のstrからunicode型への変換は「[[Python/Unicodeの取り扱い]]」でご紹介したように、decodeで行えます。 |
| + | |
| + | settingStr2 = settingFile.get("strings","setting_str_2") |
| + | settingStr2Utf = settingStr2.decode("utf_8") |
| + | print settingStr2Utf |
| + | print type(settingStr2Utf) |
| + | |
| + | 結果 |
| + | 文字列2 |
| + | <type 'unicode'> |
| + | |
| + | **真偽型の読み込み [#j29371a3] |
| + | |
| + | 真偽値の読み込みはgetbooleanを使います。 |
| + | |
| + | settingBool = settingFile.getboolean("other","setting_bool") |
| + | print settingBool |
| + | print type(settingBool) |
| + | |
| + | 結果 |
| + | True |
| + | <type 'bool'> |
| + | |
| + | **デフォルト値の指定 [#q12187cb] |
| + | |
| + | 値が設定ファイルに存在しないときのために、デフォルト値を指定することもできます。 |
| + | |
| + | 例えば、 |
| + | |
| + | settingFile = ConfigParser.SafeConfigParser({"setting_str_3":"no setting"}) |
| + | |
| + | のように初期化すると、 |
| + | |
| + | settingStr3 = settingFile.get("strings","setting_str_3") |
| + | print settingStr3 |
| + | |
| + | 結果 |
| + | no setting |
| + | |
| + | となります。 |
| + | |
| + | *まとめ [#w4727992] |
| + | |
| + | ConfigParserを使うと、str、int、float、bool型を簡単に読み込めるようになります。デフォルト値の指定も簡単です。 |
| + | |
| + | ちょっとした設定ファイルが必要な時には重宝します。またここでは紹介していませんが、ファイルの書き込みも可能です。 |