Yamamoto's Laboratory
 
OS関係
 
ファイル
  configparser
 
数学・科学
 
出力
 
その他
 
 

configparser とは

概要

Python を用いて処理を行うとき,処理の仕方をファイルで設定したい場合があります.Windows の場合,初期設定ファイル(*.INI,INIファイルと呼ばれる)にパラメーターが書かれます.Python のモジュール configparser は,この INI ファイルを読むために使われます.もちろん,Python が動作する環境であれば,Windows に限らず,どのようなプラットフォームでも動作します.

私は,計算のインプットファイルの読み込みに,configparser を使うことがあります.結構便利です.計算のインプットファイルのフォーマとを決めて,それを読み込む処理は結構大変です.configparser を使うと,とても簡単になります.

何ができるのか

configparser を使うとフォーマットに従ったファイルをコマンドひとつで読み込むことができます.具体的には,以下のようなファイルを読み込むことができます.読み込んだファイルは,辞書型で格納されます.したがって,簡単にデータにアクセスできます.

configparser で読み込めるファイル

[Physical constant]
  particle: electron
  mass:     9.1093e-31
  charge:   1.6021e-12

[Initial Condition]
  E0: 20e3
  z0: 0.123  

[Potential]
  z:    0.0  1.1    3.5     4.5
  phi:  0.0  1.5e3  3.5E3   6.5E3

用語の説明

表1 に,ここでの説明に使う用語の定義を示します.

特殊な用語の定義や説明
用語 説明
セクション (section) キーをまとめる単位.リスト2を参照.
キー (key) 値に紐付けられる名前.オプションと言われることもあります.リスト2を参照.
configparser で読み込まれる文字列データ.エントリーと呼ばれることもあります.セクションとキーで紐付けられます.
辞書 値を格納するデータ構造.辞書「インスタンス名[セクション][キー]」で,値を呼び出したり,変更ができます.

ファイルと読み込み

ここでは,configparser で読み込むファイルのフォーマットを示し,実際の読み込みを行います.大体の使い方が理解できるでしょう.

ファイルのフォーマット

読み込みファイルは,指定のフォーマットで書かれたテキストファイルです.リスト1に,その具体例を示します.ファイルのフォーマットには以下の規則があります.

  • コメント 行頭がナンバーサイン「#」,あるいはセミコロン「;」の場合,その行はコメントになります.
    • デフォルトでは,有効なコメント文字は行頭のみ — インデントはOK — です.行の途中 (文字列の間) にこれらの文字を入れてもコメントとして取り扱われません.
    • インスタンス作成時にクラスの引数に「inline_comment_prefixes=('#', ';')」とすると,インラインコメントが使えます.タブルで指定された文字がコメントの開始になります.この場合,「#」あるいは「;」があると以降,行末までコメントになります.
  • 階層構造 ファイルは,section > key > 値(データ) と階層構造をしています.
  • セクション section は文字列を角カッコ (例: [hoge]) で囲みます.空白を含めることも可能で,文字列の前後の空白もセクション名になります.大文字小文字の区別をします(デフォルト).
  • キー 大文字小文字の区別はありません(デフォルト).キーの文字列の間に空白は有効ですが,前後の空白は無視されます.
  • 区切り文字 キーと値を区切る文字 (デリミタ) です.デフォルト文字は (':' or '=') です.
    • 行中で最初に現れた区切り部分文字列がデリミタと見なされます.複数のデリミタがある場合,二番目以降は値の一部とみなされます.
  • 値(データ) section>key に紐づく値(データ)は,key の後にコロン「:」,あるいは等号「=」に引き続き,記述します.
    • キーの直後と値の後ろの空白は無視されます.すなわち,値の始まりと終わりは文字です.
    • 値の有効範囲は行末までです.
    • キーよりもインデントを深くすると,複数行の文字列を値とすることができます.改行も値に含まれますが,行頭と行末の空白は値に含まれません.デフォルトでは空行

設定ファイルの一般的な構造

# 行頭が (# or ;) の場合,その行はコメントになります.
[Section 1]
  key 1: value
  key 2: value

[Section 2]
  key3 = value

簡単な例

単純な例ですが,configparser の動作を理解するために,リスト3のファイルを読み込みます.このファイルには,二つのセクション('Basic Info', 'Interest')があります,それぞれセクションは,キー(name, address, birthday, height), ('interest', 'language')を持ちます.そして,セクションとキーに紐付けられた値があります.セクションとキー,値の関係は説明するまでもないでしょう.

configparser で読み込むファイルの例(yamamoto.dat)

# configparser を使ったインプットファルの例

[Basic Info]
  Name:     Masashi Yamamoto
  Address:  Tokyo, Japan
  Birthday: 1963.2.15
  Height:   173.5

[Interest]
  Internet: WEBサイト作成
  Language: Python

このファイルを読み込むプログラムは,とても簡単です.リスト4にプログラム例を示します.002行目で configparser をインポートします.004行目でインスタンスを作成し,005行目でファイルを読み込みます.たった2行で,ファイルを読みが完了です.読み込んだデータは,dat['Basic Info']['name'] で呼びすことできます.セクションとキーで構成される辞書ですね.

セクションのリストはdat.sections(),キーのリストは[key for key in dat['Basic Info']のようにして得ることができます.リスト 4 の 007 – 008 行目あたりでは,このようにしてセクションとキーを得ています.そして,009 行目でセクションとキー,紐付けられた値を表示します.簡単にファイルの値を読み込むことができます.

ファイルを読み込むプログラム例(simple.py)

001   #!/usr/bin/python3
002   import configparser
003   
004   dat = configparser.ConfigParser()
005   dat.read('yamamoto.dat')
006   
007   for section in dat.sections():
008       for key in dat[section]:
009           print('{0:s} > {1:s}:\t{2:s}'.\
010                 format(section, key, dat[section][key]))

以下に,このプログラムの実行結果を示します.こここの実行結果から分かりませんが,全ての値は文字列です.例えば,実行結果で表示されている 173.5 も文字列 '173.5' です.値は文字列であることに注意が必要です.「そんなの困るやんけ」という人のために,数値を読み込む方法を次節で説明します.

$ python3 simple.py
Basic Info > name:	Masashi Yamamoto
Basic Info > address:	Tokyo, Japan
Basic Info > birthday:	1963.2.15
Basic Info > height:	173.5
Interest > internet:	WEBサイト作成
Interest > language:	Python

実用的な読み込み

先に示したように,configparser で読み込んだファイルの内容(値)は文字列型として辞書に格納されます.数値や複数の数値を読む場合には,少しばかりの工夫が必要です.文字列を読み込んだ後に,後処理で数値などに変換します.ここでは簡単な例を示します.

数値の読み込み

configparser で数値を読み込みたい場合があります.例えば,以下のファイル中の整数(1)と浮動小数点数 (1.00794) です.

configparser で数値が書かれたファイルの例(numeric.dat)

[hydrogen]
  symbol: H
  number: 1
  weight: 1.00794

configparser では数値を読み込むことができないので,読み込んだ文字列を数値に変換する必要があります.configparser には変換 (文字列 → 数値) の仕組みが,getint() と getfloat() というメソッドが用意されています. 以下,これらのメソッドを使った具体例を示します.

数値データファイルを読み込むプログラム例(read_num.py)

001   #!/usr/bin/python3
002   import configparser as config
003   
004   atom = config.ConfigParser()
005   atom.read('numeric.dat')
006   
007   print("{0:s}".format(atom['hydrogen']['symbol']))
008   print("{0:d}".format(atom.getint('hydrogen','number')))
009   print("{0:f}".format(atom.getfloat('hydrogen','weight')))

8行目と9行目で,整数あるいは浮動小数点数に変換します.実行結果は以下のとおりです.

$ python3 read_num.py  
H
1
1.007940

ブール値の読み込み

メソッド「getboolean()」は,指定されたセクション中のキーの文字列をブール値に型変換します.True あるいは False を返す文字列は以下の通りです.大文字と小文字の区別はありません.他のいかなる値も ValueError を送出します.

ブール値 文字列
True 1 yes true on
False 0 no false off'

以下のファイルを読み込んで,ブール値を返すプログラムを作成します.ファイル中のすべての値は,ブール値 (True or False) です.

configparser でブール値 (True, False) が書かれたファイルの例(bool.dat)

[Masashi]
  female: 0
  have job: yes
  Japanese: true
  PC sw: off

これも先に示した整数や浮動小数点表示の場合と同じで,値を文字列として読み込んだ後に,ブール値に変換します.変換に使うメソッドは「getboolean(セクションキー)」です.以下に,具体的なプログラムを示します.

ブール値を読み込むプログラム例(read_bool.py)

001   #!/usr/bin/python3
002   import configparser as config
003   
004   person = config.ConfigParser()
005   person.read('bool.dat')
006   
007   for section in person:
008       for key in person[section]:
009           print(section, ' > ', key, ': ', person.getboolean(section,key))

009行目の person.getboolean(sectionkey) で文字列をブール値に変換します.その他の部分は説明するまでもないでしょう.

プログラムの実行結果を以下に示します.ブール値 (True or False) に変換されることが理解できます.

$ python3 read_bool.py
Masashi  >  female :  False
Masashi  >  have job :  True
Masashi  >  japanese :  True
Masashi  >  pc sw :  False

リストの読み込み

configparser が読み込む値は単純な文字列なので,リストを読み込むことはできません.この場合も前節で示したように,読み込んだ文字列を文字列や数値に変換します.

文字列

以下のファイルのように空白で区切られた文字列(単語)をリストにします.

configparser で文字列(単語)のリストが書かれたファイルの例(list.dat)

[family]
  yamamoto: masashi keiko kohei shunsuke
  yamada: taro hanako ichiro jiro

空白で分けられていますが,configparser では一行の文字列です.これをリストにするためには,メソッド split() を使います.このメソッドは,空白や改行、タブで文字列を区切り,リストにして返します.また,引数に区切り文字(文字列も)を指定することも可能です.したがって,読み込んだ一行の文字列をある任意の区切り文字(ここでは空白)でリストにすることができます.以下に具体的なプログラム例を示します.

文字列(単語)のリストを読み込むプログラム例(read_list.py)

001   #!/usr/bin/python3
002   import configparser as config
003   
004   data = config.ConfigParser()
005   data.read('list.dat')
006   
007   a = data['family']['yamamoto'].split()
008   b = data['family']['yamada'].split()
009   
010   print(a)
011   print(b)

実行結果は,以下のとおりです.リストは,元の文字列を空白で区切った単語になっています.

$ python3 read_list.py
['masashi', 'keiko', 'kohei', 'shunsuke']
['taro', 'hanako', 'ichiro', 'jiro']

数値

次に数値のリストを読み込みます.以下を数値 (整数と浮動小数点数,複素数) をリストにします.

configparser で数値のリストが書かれたファイルの例(list.dat)

[number]
  prime: 1 2 3 5 7 11 13 17 19 23 29 31
  root:1 1 1.414 1.732 2.236 2.645
  complex:1+3j 4.5+5.6j 3.2425+2.71828j

先ほど同様,メソッド split() を使い,文字列を単語のリストに変換します.そして,その数値が書かれた単語を整数あるいは浮動小数点数に型変換します.リストを一度に型変換することができないので,ひとつずつ変換します.内包表記が便利です.

数値のリストを読み込むプログラム例(read_list.py)

001   #!/usr/bin/python3
002   import configparser as config
003   
004   lst = config.ConfigParser()
005   lst.read('list.dat')
006   
007   p = [int(x)   for x in lst['number']['prime'].split()]
008   r = [float(x) for x in lst['number']['root'].split()]
009   c = [complex(x) for x in lst['number']['complex'].split()]
010   
011   print(p)
012   print(r)
013   print(c)

プログラムの実行結果を以下に示します.

$ python3 read_list.py
[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
[1.0, 1.0, 1.414, 1.732, 2.236, 2.645]
[(1+3j), (4.5+5.6j), (3.2425+2.71828j)]

機能の詳細

コンストラクターの引数

インスタンスを作成するとき,コンストラクターの引数を使い値を指定すると,configparser の動作をカスタマイズすることができます.例えば,

import configparser as config
instance = config.ConfigParser(inline_comment_prefixes=('#', ';'))

とすると,この instance ではインラインのコメントを使うことが可能になります.以下,コンストラクターに与える引数を示します.

コンストラクターの引数
変数 デフォルト 動作
defaults None [DEFAULT] セクションに加える辞書 (キーと値) を指定.特定のセクションにデフォルト値を指定する場合は read_dict() を使う.[具体例]
dict_type collections.OrderedDict デフォルトは順序付き辞書です.
allow_no_value False False: 値のないデータは不可.True: 値のないデータも可能.
delimiters ('=', ':') キーと値を区切る文字/文字列の指定.行中で最初に現れた文字/文字列がデリミタとなる.つまり値にデリミタを含めることができる.[具体例]
comment_prefixes ('#', ';') コメントの文字/文字列の指定.行頭にこれらの文字/文字列があると,その行はコメント行になる.[具体例]
inline_comment_prefixes None インラインコメントの文字/文字列の指定.行中にこれらの文字/文字列があると,以降はコメントになる.[具体例]
strict True True: セクションやキーの重複が不可.[具体例]
empty_lines_in_values Ture False にすると複数行にわたる値の間に空行が不可になる.[具体例]
default_section configparser.DEFAULTSECT このデフォルト値は,'DEFAULT'です.変更する場合は,default_section = 'general' のように指定します.[具体例]
interpolation configparser.BasicInterpolation
converters

ページ作成情報

参考資料

更新履歴

2017年12月04日 ページの新規作成


no counter