3

Pythonの構成ファイルを、各値を明示的に「取得」せずにデータ構造に完全に読み込みたいと思います。これを行う理由は、変更に基づいて新しい構成ファイルを作成することを目的として、これらの値をプログラムで変更する予定であるためです(たとえば、変更するように変更するという変数があり[Foo] Bar = 1ます)。[Foo] Bar = 2

現在、私はすべての値を手で読んでいます:

parser = SafeConfigParser()
parser.read(cfgFile)
foo_bar1 = int(parser.get('Foo', 'Bar1'))
foo_bar2 = int(parser.get('Foo', 'Bar2'))

私が望んでいるのは(Googleに関してはあまり見つかりませんでした)、それらをリストに読み込み、リストからその値を引き出して変更できるように、それらを簡単に識別できるようにする方法です。

基本的にそれを(または同様に)参照します:

config_values = parser.read(cfgFile)
foo_bar1      = config_values('Foo.bar1')
4

3 に答える 3

3

誤解していたらごめんなさい -- これはあなたが持っているものとあまり変わらないようです -- 非常に単純なサブクラスが機能するようです:

class MyParser(SafeConfigParser):
    def __call__(self,path,type=int):
        return type(self.get(*path.split('.')))

もちろん、実際にはサブクラスも必要ありません。ものを別の関数に入れることができ__call__ます...

于 2012-11-09T14:35:55.563 に答える
2

Python 2.7を実行していますか?

数か月前に、構成ファイルを解析し、辞書内包表記を使用して辞書をセットアップするという、気の利いた方法があります。

config = ConfigParser.ConfigParser()
config.read('config.cfg')
# Create a dictionary of complete config file, {'section':{'option':'values'}, ...}
configDict = {section:{option:config.get(section,option) for option in config.options(section)} for section in config.sections()}

この方法は読みにくいですが、使用するスペースが少なくて済み、取得するすべての変数を明示的に指定する必要はありません。

  • 注:これはPython 2.6(*私が知っている)では機能しません。私は過去にこれを使用したスクリプトを作成しましたが、Windowsで2.7を実行しているため、2.6を実行しているLinuxマシンの誰かが辞書の理解でクラッシュします。

- 編集 -

それでも、値のデータ型を手動で変更する必要があります。

于 2012-11-09T15:02:24.553 に答える
2
import sys
from ConfigParser import SafeConfigParser

parser = SafeConfigParser()
parser.readfp(sys.stdin)

config = dict((section, dict((option, parser.get(section, option))
                             for option in parser.options(section)))
              for section in parser.sections())
print config

Input

[a]
b = 1
c = 2
[d]
e = 3

Output

{'a': {'c': '2', 'b': '1'}, 'd': {'e': '3'}}
于 2012-11-09T16:22:15.413 に答える