web-dev-qa-db-ja.com

構成ファイル内のセクションを反復処理する

最近、ライブラリconfigparserを紹介しました。各セクションに少なくとも1つのブール値が1に設定されているかどうかを確認したいと思います。次に例を示します。

[Horizontal_Random_Readout_Size]
Small_Readout  = 0
Medium_Readout = 0
Large_Readout  = 0

上記によりエラーが発生します。

[Vertical_Random_Readout_Size]
Small_Readout  = 0
Medium_Readout = 0
Large_Readout  = 1

上記は合格します。以下は、私が念頭に置いていたもののいくつかの擬似コードです。

exit_test = False
for sections in config_file:
    section_check = False
    for name in parser.options(section):
        if parser.getboolean(section, name):
            section_check = True
    if not section_check:
        print "ERROR:Please specify a setting in {} section of the config file".format(section)
        exit_test = True
    if exit_test:
        exit(1)

質問:

1)最初のforループを実行し、構成ファイルのセクションを反復処理するにはどうすればよいですか?

2)これはこれを行う良い方法ですか、それともより良い方法がありますか? (ない場合は質問に答えてください。)

21
Marmstrong

ConfigParser を使用すると、設定を解析する必要があります。

解析後、 .sections() メソッドを使用してすべてのセクションを取得します。

各セクションを反復処理し、 .items() を使用して、各セクションのすべてのキー/値のペアを取得できます。

for each_section in conf.sections():
    for (each_key, each_val) in conf.items(each_section):
        print each_key
        print each_val
53
Nilesh

最善の方法は、ファイル内のすべての行をある種の配列にロードすることです(使用するメモリの量と、代わりにページングするかどうかの問題は無視します)。

次に、見出しを示す行が特定の形式に従っていることがわかります。そのため、配列を反復処理して、見出し名を含むオブジェクトの配列を作成できます。行インデックス(マスター配列へのゼロベースの参照)およびその見出しに値が設定されているかどうか。

そこから、これらのオブジェクトをマスター配列への相互参照で繰り返し、各見出しについて、現在の見出しと次の見出しの間の(マスター配列内の)次の「n」行を確認します。

この時点で、その見出しの個々の設定値に到達しているので、行を解析して値を簡単に検出できるはずです。trueの場合はループから抜けることができます。 1つの値のみが設定されるようにするための見出しの値。

このアプローチを使用すると、見出しごとに1つのオブジェクトですべての行にアクセスできるため、コードは柔軟性と機能を維持します。その後最適化します。

理にかなっていて、役立つことを願っています。

1
user3360243